簡體   English   中英

C# 中的正則表達式 OR 運算符問題

[英]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\\~\\!\\@\\#\\$\\%

\\^\\&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 運算符會引發異常。 我怎樣才能解決這個問題?

它不應該與以下任何一個匹配:

這是一種方法。 從字符串的開頭開始並檢查每個字符是否不是'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM