我需要一个正则表达式,它捕获第一个表达式。如果找不到,赶上第二个。 第一个是一个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'。我尝试了几种变体,但没有任何效果。
答案 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)
你为什么不抓住它们?通过使用“|”的替代品?