PHP Regex如果那么模式

时间:2015-03-10 12:09:12

标签: php regex

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

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

注意:我在PHP中写这个

我希望代码能够找到3.10英镑,而不是3英镑。基本上,除非前面有小数点和2位数字,否则不能允许字母“p”。

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

有效输入的更多示例: £3.50 350 £350 234P

输入无效: £2P

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

谢谢

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

你可以在这里测试一下: https://regex101.com/r/mG8kR0/1

答案 2 :(得分:0)

目前尚不清楚您的有效样本&#34; 234p&#34;匹配您的规则&#34;如果至少有两个数字和一个点&#34;则允许p。但是,在你的问题中,你使用积极的前瞻,这似乎是一个开销。

您的p规则可写为:(\.[0-9]{2}p?)

总而言之,您只需要:/^(£)?[0-9]+(\.[0-9]{2}p?)$/

如果你允许&#34; 234p&#34;另外,只需将句点设为可选:/^(£)?[0-9]+(\.?[0-9]{2}p?)$/

在此处试试:http://www.regexr.com/

后一个正则表达式为所有有效样本提供正反馈,并且它拒绝无效输入。目前还不清楚如果只有两个数字会发生什么,如果抓住一些部分很重要,那么应该有更多的括号。

答案 3 :(得分:0)

怎么样:

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