我们无法创建正则表达式来匹配包含888的所有文件名,但包含888/444、888/447或888/405的文件名除外。
我们尝试使用字符类并否定它们,但它们似乎不起作用。忠告?
以下是我们的尝试:/888.[^(444)|(447)|(405)]/
我们使用的是Ruby1.9.3。谢谢!
最佳答案
[^a-z]
匹配不在
a-z
范围内的字符。在您的尝试中,您在character类中放置了一个alternation组,但它并不是这样工作的。相反,您需要使用一个否定的lookaround断言(假设ruby支持这些断言):/^888(?!(44[47]|405)).*$/
要分解这个:
^ # Anchor to start of string
888 # Match 888
(?! # Negative lookahead
( # Alternation group
44[47] # Match 444 or 447
| # ...or...
405 # 405
)
)
.* # Match any number of any characters
$ # Anchor to end of string
请注意,表示“匹配任意数量的任意字符”的部分将受到负展望的限制,因此44447和405将不匹配,根据您的要求。
因此,这将匹配
888123
,888 foo bar
,但不允许888444
或888447
等。编辑以匹配字符串中任何位置出现的要求:
/888(?!.*4(4[47]|05)).*/
也就是说,匹配任何888后跟任何东西(不包括任何东西),除了444、447或405。