除了那些包含888 / 444,888 / 447或888/405的文件名以外,正则表达式用于匹配所有文件名888?

时间:2013-03-25 09:57:29

标签: ruby regex

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

我们尝试使用角色类并否定它们,但它们似乎没有用。建议?

以下是我们尝试的内容:/888.[^(444)|(447)|(405)]/

我们正在使用Ruby 1.9.3。谢谢!

5 个答案:

答案 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将匹配,根据您的要求。

因此,这将匹配888123888 foo bar,但不允许888444888447等。


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

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

,即匹配任何888后跟任何东西(包括什么都没有),除了444,447或405之外。

答案 3 :(得分:2)

我要去:

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

我不相信有更简单的方法。

答案 4 :(得分:0)

如果你有一些非常特别的东西,就像你现在的东西一样,为什么不匹配逆,然后过滤掉匹配的项?

像这样:

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

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