我们无法创建正则表达式来匹配所有包含 888 的文件名,但包含 888/444、888/447 或 888/405 的文件名除外。
我们尝试使用字符类并否定它们,但它们似乎不起作用。建议?
这是我们尝试过的:/888.[^(444)|(447)|(405)]/
我们使用的是 Ruby 1.9.3。谢谢!
建议:
%r"888(?!/444|/447|/405)"
使用负前瞻:
888.(?!(444)|(447)|(405))
[^a-z]
匹配不在范围内的字符a-z
。在您的尝试中,您已经在角色类中放置了一个交替组,但它根本不像那样工作。相反,您需要使用否定的环视断言(假设 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
请注意,根据您的要求,“匹配任意数量的任意字符”部分将受到否定前瞻的限制,因此 444、447 和 405 将不匹配。
因此,这将匹配888123
, 888 foo bar
,但不允许888444
or888447
等。
编辑要匹配出现在字符串中任何位置的要求:
/888(?!.*4(4[47]|05)).*/
即,匹配任何 888 后跟任何内容(包括任何内容),但 444、447 或 405 除外。
我要去:
/^(?!.*888\/(444|447|405)).*888.*/
我不相信有更简单的方法可以做到这一点。
如果你有一些非常具体的东西,比如你现在拥有的东西,为什么不匹配逆向然后过滤掉匹配的项目呢?
像这样:
/(888\/444)|(888\/447)|(888\/405)/
匹配那些你不想要的,使用它并相应地消除。