簡體   English   中英

使用正則表達式匹配給定條件下的字符串

[英]Use regex to match string in given condition

[編輯]注意:

最短正則表達式是主要問題,而不是反向引用。


需求:

使用最短的正則表達式匹配以下格式的所有字符串:

<two digits><connect char><three digits><connect char><four digits>

為方便閱讀:

<two digits>
<connect char>
<three digits>
<connect char>
<four digits>

條件:

  • 匹配整個字符串,假設輸入字符串是單行。
  • Connect char可以省略,也可以是[-./ ] (不包括[] )中的任何一個。
  • 每個匹配的字符串中兩個connect char 必須相同
  • 最短是重要的,性能並不重要。

一些有效字符串:

55.635.8828
72/683/1582
86 942 7682
581827998      // Both connect chars is omit

一些無效字符串:

56.855/9856     // Two connect chars are different.
56 4559428      // Same as above

這個短正則表達式將匹配所有有效的字符串:

^\d{2}[-./ ]?\d{3}[-./ ]?\d{4}$

但它也匹配無效的:

52-355/9984

這個正則表達式將匹配所有正確的字符串,但很長。 我把它分成多行以便於閱讀:

^(\d{2}-?\d{3}-?\d{4})|
(\d{2}\.?\d{3}\.?\d{4})|
(\d{2}/?\d{3}/?\d{4})|
(\d{2} ?\d{3} ?\d{4})$

你能建議我一個符合要求的更短的正則表達式嗎?

您可以捕獲分隔符並使用反向引用而不是重復模式

^\d\d([-./ ]?)\d{3}\1\d{4}$
     ^       ^     ^^

請參閱正則表達式演示

在C#中:

var isValid = Regex.IsMatch(s, @"^\d\d([-./ ]?)\d{3}\1\d{4}$");

如果您只想將ASCII數字與\\d (默認情況下在.NET正則表達式中匹配所有Unicode數字 )匹配, RegexOptions.ECMAScript選項傳遞給正則表達式編譯器。

圖案細節

  • ^ - 字符串的開頭
  • \\d\\d - 任意2位數
  • ([-./ ]?) - 第1組捕獲1或0 - , . /或空間
  • \\d{3} - 任意3位數
  • \\1 - 與第1組中捕獲的值相同
  • \\d{4} - 任何4位數字
  • $ - 字符串結尾(或者您可能希望使用\\z來確保字符串的確切結束,但在大多數情況下並不是必需的)。

暫無
暫無

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

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