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''~''!''@''#''$''%
''^''&''*''('')_''-''=''+''''''/''?''.'':'';''''',]*)?)([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''~''!''@
''#''$''%''^''&''*''('')_''-''=''+''''''/''?''.'':'';''''',]*)?)([0-9][0-9]KK[a-
z][a-z])(?!</a>)","replaced");
第二个带有OR操作符的抛出异常。我该如何解决这个问题?
它不应该匹配以下任何一个:
example99KKas
http://stack.com/99KKas
这是一种方法。从字符串的开头开始,检查每个字符是不是'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");