如果在正则表达式中

时间:2011-07-07 10:53:33

标签: php regex

我需要一个正则表达式,它捕获第一个表达式。如果找不到,赶上第二个。 第一个是一个2-4长的数字,后面跟着'X',如果没有找到,只要抓住没有'X'的2-4长数字。

  

foo bar 321 string 1234X等等// catch 1234X

我找到了一个简短的例子here (a)?b(?(1)c|d),但我误解了它。

(\d{2,4}X)?(?(1)(\d{2,4})X|\D(\d{2,4})\D)

总是找到'321'。我尝试了几种变体,但没有任何效果。

2 个答案:

答案 0 :(得分:5)

您可以使用:

/(?| .*? (\d{2,4}X) | (\d{2,4}) (?!X) )/xs

(在使用之前引用并正确使用它。)

请注意,它会与1111X中的1111111111111111111X匹配,如果该数字是“字词”的一部分。如果你不想使用类似的东西:

/(?| .*? \b(\d{2,4}X) | \b(\d{2,4}) ) \b /xs

Perl演示:

perl -E "say join',','foo 123 bar 345X 44 33X' =~ /(?| .*? (\d{2,4}X) | (\d{2,4}) (?!X) )/xs;"
345X

答案 1 :(得分:0)

你为什么不抓住它们?通过使用“|”的替代品?