[英]Problem with RegEx OR operator in C#
我想匹配一個模式[0-9][0-9]KK[az][az]
前面沒有這兩個詞
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 運算符會引發異常。 我怎樣才能解決這個問題?
它不應該與以下任何一個匹配:
例子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"
"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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.