PHP 正则表达式 IF THEN 模式


PHP Regex IF THEN pattern

我是编写正则表达式模式的新手,我正在努力理解为什么以下行不起作用。

/^(£)?[0-9]+(?(?='.[0-9]{2}){0,1}(p)?|$)/

注意:我正在用PHP写这个

我希望代码找到 £3.10p,但不是 £3p。 本质上,字母"p"是不允许的,除非它前面有小数点和 2 位数字。

编辑:为了澄清,字母p可以在字符串的末尾使用,但是如果字符串包含£和/或小数点,则p必须以点和2位数字开头。

更多有效输入示例:£3.50350£350234便士

输入无效:£2便士

有人可以解决这个问题并解释我在这里出错的地方吗?

谢谢

如果允许 0.50p,那么您可以这样做:

^((£?[0-9]+)(?!p)|([0-9]+p?))?(?<!p)('.[0-9]{2})?p?$

正则表达式与您的所有示例一起保存:https://regex101.com/r/rE1bT9/3

试试这个: /^(?(?=£)(£'d+'.'d{2}p?|£'d+)|'d+p?)$/

您可以在此处进行测试:https://regex101.com/r/mG8kR0/1

目前尚不清楚您的有效样本"234p"如何与您的规则"如果至少有两位数字和一个点,则允许 p"。但是,在您的问题中,您使用的是积极的展望,这似乎是一个开销。

你的 p 规则可以写成:('.[0-9]{2}p?)

所以总的来说,你只需要:/^(£)?[0-9]+('.[0-9]{2}p?)$/

如果您还允许"234p",只需将句点设置为可选:/^(£)?[0-9]+('.?[0-9]{2}p?)$/

在这里尝试一下:http://www.regexr.com/

后一个正则表达式对所有有效样本给出积极的反馈,并拒绝无效输入。目前还不清楚如果只有两位数会发生什么,如果抓住一些碎片很重要,应该有更多的括号。

怎么样:

/^(?:£?[0-9]+(?:'.[0-9]{2})?|[0-9]+p?)$)/