难以找到在正则表达式中插入“单词排除”的位置

时间:2014-05-26 17:35:22

标签: c# javascript regex

我知道排除单词的正则表达式,大致无论如何,它将是(!?wordToIgnore|wordToIgnore2|wordToIgnore3)

但我有一个现有的,复杂的正则表达式,我需要添加这个,我对如何去做有点困惑。我仍然是regex的新手,我花了很长时间来制作这个特别的,但我不知道在哪里插入它或者如何...

我的正则表达式是......

^(?!.*[ ]{2})(?!.*[']{2})(?!.*[-]{2})(?:[a-zA-Z0-9 \:/\p{L}'-]{1,64}$)$

这应该只允许键入的人插入1到64个匹配该模式的字母,不能以空格,引号,双引号,特殊字符,短划线,转义字符等开头,并且只允许az同时大写和小写,可以在任何地方包括空格,“:”,短划线和引号。

但是我想禁止他们使用某些单词,所以我有这个我希望被禁止的单词列表,我只是无法弄清楚如何适应这里...我试着粘贴整个。 。“阻止”,并没有奏效。

?!the|and|or|a|given|some|that|this|then|than

有没有人遇到过这个?

2 个答案:

答案 0 :(得分:3)

ciel,首先,祝贺我们试图建立你的正则规则。如果您想阅读有关各种排除的详细信息,建议您查看Match (or replace) a pattern except in situations s1, s2, s3 etc

接下来,在您的特定情况下,我们将如何处理您的正则表达式。

  1. 为了进行整理,让我们将所有负面外观更紧凑,用一个(?!.*(?: |-|'){2})取代它们
  2. 在你的角色类中,\:只是不必要地逃过冒号,因此:就足够了。我假设你想添加一个反斜杠字符,如果需要,我们需要使用\\
  3. \p{L}包含[a-zA-Z],因此您可以删除[a-zA-Z]。但是你确定要匹配任何脚本中的所有字母吗? (泰国等)。如果是这样,请记住在正则表达式字符串之后设置u标志。
  4. 对于应用于整个字符串的“坏词排除”,将其置于与其他外观相同的位置,即位于字符串的开头,但使用.*与其他排除项一样: (?!.*(?:wordToIgnore|wordToIgnore2|wordToIgnore3))首先看哪个先行是没关系的,因为lookarounds不会改变你在字符串中的位置。有关详情,请参阅Mastering Lookahead and Lookbehind
  5. 这给了我们这个光荣的正则表达式(我添加了不区分大小写的标志):

    ^(?i)(?!.*(?:wordToIgnore|wordToIgnore2|wordToIgnore3))(?!.*(?: |-|'){2})(?:[\\0-9 :/\p{L}'-]{1,64}$)$ 
    

    当然,如果您不想要unicode字母,请将\p{L}替换为a-z

    另外,如果你想确保wordToIgnore是一个真正的单词,而不是嵌入的字符串(例如你不想要cat,但你可以使用{{1} }}),为前瞻规则添加边界:catalog

答案 1 :(得分:0)

使用它:

^(?!.*(the|and|or|a|given|some|that|this|then|than))(?!.*[ ]{2})(?!.*[']{2})(?!.*[-]{2})(?:[a-zA-Z0-9 \:\p{L}'-]{1,64}$)$

请参阅demo