如何排除正则表达式中的某些单词

时间:2016-08-08 15:16:47

标签: regex

我想替换我的正则表达式。此当前表达式允许用户输入任何内容,只要它不包含单词“white”或单词“cat”和“dog”的组合(“cat”或“dog”分别为a)。

regex before change:
/^((?!(white|cat.*dog|dog.*cat))[\s\S])*$/i

是否可以交替使用此正则表达式,因此像“A white tiger”这样的输入是有效的,但是单词(“white”)不是?

2 个答案:

答案 0 :(得分:1)

解决方案

您需要做的是通过在开头开始前瞻来提高效率

/^(?!white$|[\s\S]*(?:cat[\s\S]*dog|dog[\s\S]*cat))[\s\S]*$/i

请参阅regex demo[\s\S]替换为.仅用于演示,因为输入是逐行测试的。

解释

/^((?!(white|cat.*dog|dog.*cat))[\s\S])*$/i包含来自知名Regular expression to match line that doesn't contain a word?帖子的锚定驯服贪婪令牌。 [\s\S]匹配任何字符(甚至换行符),以防它是否为负前瞻中定义的序列中的第一个字符。因此,上面的正则表达式匹配任何字符串,但是包含whitecat的字符串后跟除了换行符之外的0 +字符,然后是dog,反之亦然,{{1然后在除了换行符之外的0+个字符dog

之后

因此,有必要确保在锚之间测试catwhite将进行检查。

其他备选方案仍然需要在在字符串中的任何位置进行检查。因此,^(?!white$)[\s\S]*$应放在[\s\S]*群组之前:(?:cat[\s\S]*dog|dog[\s\S]*cat)。这样,我们确保字符串内部没有这些模式。请注意,前瞻中的[\s\S]*(?:cat[\s\S]*dog|dog[\s\S]*cat)仅检查第一行上的模式

详细

  • .* - 字符串开头
  • ^ - 负向前瞻检查:
    • (?! - 字符串不能等于white$
    • white - 或
    • | - 0+跟随[\s\S]*(?:cat[\s\S]*dog|dog[\s\S]*cat)的任何字符,然后是任意数量的字符cat,反之亦然
  • dog - 前瞻的结尾
  • ) - 0+任何字符
  • [\s\S]* - 字符串结束。

答案 1 :(得分:0)

你需要在负前瞻之后使用锚$

/^(?!(white|cat.*dog|dog.*cat)$)[\s\S]*$/gmi
//                   here >---^

这将仅允许white,但会允许A white tiger

RegEx Demo

PS:在Javascript中,您也可以使用[^]代替[\s\S],即

/^(?!(white|cat.*dog|dog.*cat)$)[^]*$/gmi