我们无法创建正则表达式以匹配包含888的所有文件名,但包含888 / 444,888 / 447或888/405的文件名除外。
我们尝试使用角色类并否定它们,但它们似乎没有用。建议?
以下是我们尝试的内容:/888.[^(444)|(447)|(405)]/
我们正在使用Ruby 1.9.3。谢谢!
答案 0 :(得分:3)
使用否定前瞻:
888.(?!(444)|(447)|(405))
答案 1 :(得分:3)
建议:
%r"888(?!/444|/447|/405)"
答案 2 :(得分:2)
[^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
或888447
等。
编辑要符合出现在字符串中任何位置的要求:
/888(?!.*4(4[47]|05)).*/
,即匹配任何888后跟任何东西(包括什么都没有),除了444,447或405之外。
答案 3 :(得分:2)
我要去:
/^(?!.*888\/(444|447|405)).*888.*/
我不相信有更简单的方法。
答案 4 :(得分:0)
如果你有一些非常特别的东西,就像你现在的东西一样,为什么不匹配逆,然后过滤掉匹配的项?
像这样:
/(888\/444)|(888\/447)|(888\/405)/
匹配那些你不想要的,使用它并相应地消除。