3

我们无法创建正则表达式来匹配所有包含 888 的文件名,但包含 888/444、888/447 或 888/405 的文件名除外。

我们尝试使用字符类并否定它们,但它们似乎不起作用。建议?

这是我们尝试过的:/888.[^(444)|(447)|(405)]/

我们使用的是 Ruby 1.9.3。谢谢!

4

5 回答 5

3

建议:

%r"888(?!/444|/447|/405)"
于 2013-03-25T10:07:32.437 回答
3

使用负前瞻:

888.(?!(444)|(447)|(405))
于 2013-03-25T10:06:59.883 回答
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,但不允许888444or888447等​​。


编辑要匹配出现在字符串中任何位置的要求:

/888(?!.*4(4[47]|05)).*/

即,匹配任何 888 后跟任何内容(包括任何内容),但 444、447 或 405 除外。

于 2013-03-25T10:07:12.747 回答
2

我要去:

/^(?!.*888\/(444|447|405)).*888.*/

我不相信有更简单的方法可以做到这一点。

于 2013-03-25T10:32:03.690 回答
0

如果你有一些非常具体的东西,比如你现在拥有的东西,为什么不匹配逆向然后过滤掉匹配的项目呢?

像这样:

/(888\/444)|(888\/447)|(888\/405)/

匹配那些你不想要的,使用它并相应地消除。

于 2013-03-25T10:10:11.210 回答