C# C中的正则表达式或运算符有问题#

C# C中的正则表达式或运算符有问题#,c#,.net,regex,pattern-matching,C#,.net,Regex,Pattern Matching,我想匹配一个模式[0-9][0-9]KK[a-z][a-z],该模式前面没有这两个词 http:// 范例 我有一个正则表达式,它负责第一个标准,但不负责第二个标准 无操作员或操作员 var body = Regex.Replace(body, "(?<!http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\% \\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?

我想匹配一个模式
[0-9][0-9]KK[a-z][a-z]
,该模式前面没有这两个词

  • http://

  • 范例

我有一个正则表达式,它负责第一个标准,但不负责第二个标准

无操作员或操作员

var body = Regex.Replace(body, "(?<!http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%

\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?)([0-9][0-9]KK[a-z][a-z])

(?!</a>)","replaced");
var body=Regex.Replace(body,(?),“replaced”);
接线员

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");
var body=Regex.Replace(body,(?示例)|(?),“replaced”);
带有OR运算符的第二个将引发异常。我怎样才能解决这个问题

它不应与以下任何一项匹配:

  • 例99kkas


第二个示例无法运行,它给出了一个ArgumentException“Unrecognized grouping Construction”(无法识别的分组构造)

但我替换了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");
var body=Regex.Replace(body,(?),“replaced”);

我无法让第二个示例正常工作,它给出了一个ArgumentException“Unrecognized grouping Construction”

但我替换了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");
var body=Regex.Replace(body,(?),“replaced”);

您可以使用以下内容:

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

body=Regex.Replace(body,@)(?您可以使用如下内容:

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

body=Regex.Replace(body,@”(?这里有一种方法。从字符串的开头开始,检查每个字符是否不是
'http://'
'example'
的开头。缓慢地执行此操作,每次执行一个字符,这样我们可以在到达魔术词后发现它。此外,捕获到魔术词的所有内容,以便我们可以将其放回replacement字符串。在这里,它处于注释自由间距模式,因此它可以被普通人理解:

var body=Regex.Replace(body,
@“#匹配前面没有“http://”或“example”的特殊单词”
^#锚定到管柱的开头
(?i)#设置不区分大小写模式。
(#$1:捕捉到特殊单词的所有内容。
(?:#用于应用*量词的非捕获组。
(?!http://)#断言此字符不是“http://”的开头
(?!example)#断言此字符不是“example”的开头
.#安全地匹配此可接受字符。
)*?懒洋洋地匹配零个或多个前面的字符。
)#结束1美元:一切取决于特殊词语。
(?-i)#设置回区分大小写模式。
([0-9][0-9]KK[a-z][a-z])#$2:匹配我们的特殊单词。
(?!)#断言不结束锚定标记内容。
", 
“$1更换”,
RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);

请注意,这对于神奇的单词是区分大小写的,但对于
http://
example
。还要注意,这是未经测试的(我不知道C#-只是它的正则表达式引擎)。在
“var body=…”中的
“var”
看起来有点可疑。??

这里有一种方法。从字符串的开头开始,检查每个字符是否不是
'http://'
'example'
的开头。慢慢地做,一次一个字符,这样我们可以在到达神奇单词时发现它。此外,捕获所有东西直到神奇的单词ord,这样我们就可以把它放回替换字符串中。这里它是在注释自由间隔模式下,这样它就可以被普通人理解:

var body=Regex.Replace(body,
@“#匹配前面没有“http://”或“example”的特殊单词”
^#锚定到管柱的开头
(?i)#设置不区分大小写模式。
(#$1:捕捉到特殊单词的所有内容。
(?:#用于应用*量词的非捕获组。
(?!http://)#断言此字符不是“http://”的开头
(?!example)#断言此字符不是“example”的开头
.#安全地匹配此可接受字符。
)*?懒洋洋地匹配零个或多个前面的字符。
)#结束1美元:一切取决于特殊词语。
(?-i)#设置回区分大小写模式。
([0-9][0-9]KK[a-z][a-z])#$2:匹配我们的特殊单词。
(?!)#断言不结束锚定标记内容。
", 
“$1更换”,
RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);

请注意,这对于神奇的单词是区分大小写的,但对于
http://
example
。还要注意,这是未经测试的(我不知道C#-只是它的正则表达式引擎)。在
“var body=…”中的
“var”
看起来有点可疑。?

如果您使用非插值字符串(即在第一个双引号前加“@”前缀的字符串)并去掉所有逃逸的反斜杠,您的正则表达式将更容易阅读。我只是说。而且看起来这里的正则表达式可能有错误:[0-9][0-9]KK[a-z][a-9z。应该是[0-9][0-9]KK[a-z][a-z]。这是一个键入错误。我对其进行了编辑。如果您使用非插值字符串(即在第一个双引号前加“@”前缀的字符串)并去掉所有转义的反斜杠,您的正则表达式将更易于阅读。我只是说。另外,这里的正则表达式中可能有错误:[0-9][0-9]KK[a-z][a-9z。应该是[0-9][0-9]KK[a-z][a-z]。这是一个键入错误。我编辑了它。我测试了它…这不是普通特殊词。我测试了它…这不是普通特殊词。