c#中RegEx OR操作符的问题

本文关键字:问题 操作符 OR RegEx | 更新日期: 2023-09-27 18:01:45

我想匹配一个模式[0-9][0-9]KK[a-z][a-z],它的前面没有这些单词

    http://
  • 示例

我有一个RegEx,它处理第一个标准,但不处理第二个标准。

不带OR运算符

var body = Regex.Replace(body, "(?<!http://([''w+?''.''w+])+([a-zA-Z0-9''~''!''@''#''$''%
''^''&amp;''*''('')_''-''=''+''''''/''?''.'':'';''''',]*)?)([0-9][0-9]KK[a-z][a-z])
(?!</a>)","replaced");

与OR运算符

var body = Regex.Replace(body, "(?example)|(?<!http://([''w+?''.''w+])+([a-zA-Z0-9''~''!''@
''#''$''%''^''&amp;''*''('')_''-''=''+''''''/''?''.'':'';''''',]*)?)([0-9][0-9]KK[a-
z][a-z])(?!</a>)","replaced");
第二个带有OR操作符的

抛出异常。我该如何解决这个问题?

它不应该匹配以下任何一个:

  • example99KKas

  • http://stack.com/99KKas

c#中RegEx OR操作符的问题

这是一种方法。从字符串的开头开始,检查每个字符是不是'http://''example'的开头。慢慢地这样做,一次一个字,这样我们就能在找到这个神奇的词时发现它。此外,捕获所有内容直到魔法字,以便我们可以将其放回替换字符串中。在这里,它是在注释的自由空格模式,以便它可以被普通人理解:

var body = Regex.Replace(body, 
    @"# Match special word not preceded by 'http://' or 'example'
    ^                           # Anchor to beginning of string
    (?i)                        # Set case-insensitive mode.
    (                           # $1: Capture everything up to  special word.
      (?:                       # Non-capture group for applying * quantifier.
        (?!http://)             # Assert this char is not start of 'http://'
        (?!example)             # Assert this char is not start of 'example'
        .                       # Safe to match this one acceptable char.
      )*?                       # Lazily match zero or more preceding chars.
    )                           # End $1: Everything up to  special word.
    (?-i)                       # Set back to case-sensitive mode.
    ([0-9][0-9]KK[a-z][a-z])    # $2: Match our special word.
    (?!</a>)                    # Assert not end of Anchor tag contents.
    ", 
    "$1replaced",
    RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);

注意,这对于魔法字是区分大小写的,但对于http://example则不区分大小写。还要注意,这是未经测试的(我不懂c#——只懂它的正则表达式引擎)。"var body = ..."中的"var"在我看来有点可疑。??

我无法得到第二个例子的工作,它给出了一个"无法识别的分组结构"的ArgumentException。

但是我替换了url匹配并移动了第一个可选组,并提出了这个:

var body = Regex.Replace(body, "(?<!http''://[a-zA-Z0-9''-''.]+''.[a-zA-Z]{2,3}(/''S*)?|example)
([0-9][0-9]KK[a-z][a-z])(?!</a>)","replaced");

你可以这样写:

body = Regex.Replace(body, @"(?<!'S)(?!(?i:http://|example))'S*'d'dKK[a-z]{2}'b", "replaced");