簡體   English   中英

C#在正則表達式中匹配字母,數字和特殊字符

[英]C# Matching letters, numbers and special character in regex

我有以下正則Regex

[A-Z]{2}[0-9]{4}

並且它與這樣的字符串完全匹配: AB1234 但是我必須改進此正則Regex以使其符合以下特定規則:

  • 字符串在每個組( AB1234##AB1234 )之間必須只有兩個尖號(##)
  • 它可能具有8組字符串( AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234
  • 無論組的數量如何,最后一個組的末尾都不能使用尖號(##)。 因此,如果我有3個群組,它將看起來像這樣: AB1234##AB1234##AB1234

如果我使用第二個項目符號點的示例字符串,則我的Regex將與該模式匹配,但是在這種情況下,它不能驗證每個組之間的字符。

誰能幫助我改進此正則表達式?

嘗試這個:

^([A-Z]{2}[0-9]{4}##){0,7}([A-Z]{2}[0-9]{4})$
([A-Z]{2}[0-9]{4}##){0,7}([A-Z]{2}[0-9]{4})

您可以將RegexLINQ結合使用,然后使用如下擴展方法:

public static bool Validate(this string source)
{
    string pattern = "[A-Z]{2}[0-9]{4}";
    return !source.StartsWith("##") &&
           !source.EndsWith("##") &&
           source.Split(new[] {"##"}, StringSplitOptions.RemoveEmptyEntries)
                 .All(x => Regex.IsMatch(x, pattern));
}

用法:

bool t1 = "AB1234##AB1234".Validate(); // true
bool t2 = "AB1234##AB1234##AB1234".Validate(); // true
bool t3 = "AB1234##AB1234##" // false
^(?:[A-Z]{2}[0-9]{4})(?:##(?:[A-Z]{2}[0-9]{4})){0,7}$
    ^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^   ^^^
          (1)                    (2)            (3)
  1. 匹配至少一個以兩個大寫字母開頭,后跟4個十進制數字的字符串。
  2. (可選)將其從零到7乘以##並重復第一個匹配項。

結果:( *表示匹配)

* AB1234
  AB1234x
* AB1234##AB1234
* AB1234##AB1234##AB1234
  AB1234##AB1234##AB1234x

觀看現場演示

注意:此答案與該其他答案非常相似。 但是,這里的答案始於假設存在至少一個 AB1234序列。 它然后允許它是由跟隨零至7倍的可能性 ##AB1234 最后,兩個正則表達式都很好。 這取決於個人喜好。

還要注意,我使用了非捕獲組(?:...)來避免創建在這種情況下不需要的捕獲組的不必要的開銷。 (捕獲組也稱為反向引用。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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