我们无法创建正则表达式来匹配包含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将不匹配,根据您的要求。
因此,这将匹配888123888 foo bar,但不允许888444888447等。
编辑以匹配字符串中任何位置出现的要求:
/888(?!.*4(4[47]|05)).*/

也就是说,匹配任何888后跟任何东西(不包括任何东西),除了444、447或405。

07-25 23:33