正则表达式匹配不在列表中的数字

时间:2015-02-25 16:49:21

标签: regex

我一直在尝试创建一个正则表达式来匹配列表中没有的数字,但是无法弄明白。这可能是不可能的。

例如,给定列表“1,3,13,17,21,30”我希望正则表达式匹配“40”(不在列表中),但不匹配“3”,它在清单。

有谁知道我怎么能够实现这个目标?

5 个答案:

答案 0 :(得分:1)

您似乎正在寻找使用Negative Lookahead,如下所示:

\b(?!(?:1[37]?|21|30?)\b)\d+\b

Live Demo

答案 1 :(得分:1)

如果您知道要搜索的字符串中唯一的文本只是实际数字,只需锚定到字符串的开头和结尾,然后使用否定前瞻从列表中排除数字:

(?!^1$|^3$|^13$|^17$|^21$|^30$)^\d+$

这个正则表达式可以减少一点,但我认为在这种形式下你更明显地排除了列表中的匹配,提高了可读性。

但是,如果字符串包含其他文本,您可能会尝试将其锚定到分隔符(例如空格或简单地\ b)

答案 2 :(得分:0)

只需使用您选择的语言中的两个单独的正则表达式,例如:

/\d/ && ! /(1|3|13|17|21|30)/

...或类似的东西,可能你需要锚定在每个根据你匹配的字符串(顺便说一句,你应该在SO上提出这样的问题时提供)。

答案 3 :(得分:0)

我不知道你会在什么情况下使用这个功能,但是如果你知道列表中包含所有数字而你想要过滤的数字也是数字,你为什么不使用它?

python中的

(假设list存储在l中):

s = {int(s) for s in l.split(',')}
if int(some_num_txt) in s:
    pass
else:
    pass

它比正则表达式更快,更直观。

答案 4 :(得分:0)

编辑:现在应该工作

\b(?!(1\b|3\b|13\b|17\b|21\b|31\b))\d+\b