我想替换我的正则表达式。此当前表达式允许用户输入任何内容,只要它不包含单词“white”或单词“cat”和“dog”的组合(“cat”或“dog”分别为a)。
regex before change:
/^((?!(white|cat.*dog|dog.*cat))[\s\S])*$/i
是否可以交替使用此正则表达式,因此像“A white tiger”这样的输入是有效的,但是单词(“white”)不是?
答案 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]
匹配任何字符(甚至换行符)但,以防它是否为负前瞻中定义的序列中的第一个字符。因此,上面的正则表达式匹配任何字符串,但是包含white
或cat
的字符串后跟除了换行符之外的0 +字符,然后是dog
,反之亦然,{{1然后在除了换行符之外的0+个字符dog
。
因此,有必要确保在锚之间测试cat
:white
将进行检查。
其他备选方案仍然需要在内,在字符串中的任何位置进行检查。因此,^(?!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
PS:在Javascript中,您也可以使用[^]
代替[\s\S]
,即
/^(?!(white|cat.*dog|dog.*cat)$)[^]*$/gmi