PHP正则表达式问题 - 可选文本

时间:2009-03-05 14:06:26

标签: php regex

以下正则表达式应为Do Dollars Dollar或#do #Dollars或#Dollar,但不适用于Doblabla(目前为止)等。

/^@(?P<name>\w+) (?P<amount>\d+) [#]?Do(?:llars?)?/i

我该如何改变?所以它不再匹配Dogfood和Dogs等......

更新3:未解决之后

 /^@(?P<name>\w+) (?P<amount>\d+) [#]?(do(?:llars?|s))/i

以下内容不匹配:

@name 2 do

有什么想法吗?

我的第二个问题是如何让它也匹配到:Dox和#Dox

所以最后我希望它与

匹配
@name 2 #do
@name 2 do
@name 2 #dollars
@name 2 dollars
@name 1 dollar
@name 1 #dollar
@name 2 dox
@name 2 #dox

,别无其他。

非常感谢!

5 个答案:

答案 0 :(得分:2)

如果我没有弄错的话,(?:llars?)?表明这将匹配以do开头的任何内容,而不关心它之后是什么,因为它是可选的。

在结尾处添加$以强制字符串以do或dollar结尾。

答案 1 :(得分:2)

这应该适合你:

/^@(?P<name>\w+) (?P<amount>\d+) #?Do(?:llars?|x)(?:\s|$)/i

这匹配名称和金额后跟一个可选的#然后“do”然后“llar”,“llars”,空格或字符串的结尾。

答案 2 :(得分:1)

使用$锚点标记行尾,|运算符代替alt-1|alt-2|…

 /^@(?P<name>\w+) (?P<amount>\d+) #?(do(?:llars?|x)?)$/i

答案 3 :(得分:1)

我在Regexp.net上尝试了一些后找到答案

[#]?(do(?:llars?))

答案 4 :(得分:0)

也许我不完全理解,但你的正则表达式看起来过于复杂。这样做有什么不对?

/^@name [12] #?do(llar|llars|x)?$/

编辑:在阅读完评论后,听起来您还有其他要求,而您没有提出问题。编辑那些我们有一个实际的完整问题可以使事情变得更容易。