我是编写正则表达式模式的新手,我很难理解为什么以下行不起作用。
/^(£)?[0-9]+(?(?=\.[0-9]{2}){0,1}(p)?|$)/
注意:我在PHP中写这个
我希望代码能够找到3.10英镑,而不是3英镑。基本上,除非前面有小数点和2位数字,否则不能允许字母“p”。
编辑:为了澄清,字母p可以在字符串的末尾使用,但是如果字符串包含£和/或小数点,则p必须以点和2位数字开头。
有效输入的更多示例: £3.50 350 £350 234P
输入无效: £2P
有人可以解决这个问题并解释我在这里出错的地方吗?
谢谢
答案 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?)$)/