簡體   English   中英

正則表達式帶有混合字符集,每個字符集都有不同的計數

[英]Regex with mixed character set and different counts for each

我正在嘗試使用正則表達式查找固定長度的數字。 問題是,在某些情況下,數字會分成由空格或破折號分隔的部分。 例如:

  • 123456789
  • 123456789
  • 12 34567 89
  • 123-456-789
  • 12-345678-9

我想你明白我的意思。 我當前使用的正則表達式只會得到第一個數字:

(?<=^|\D)([0-9]{9})(?=$|\D)

當我在字符列表中添加空格和破折號時,如下所示:

(?<=^|\D)([0-9 -]{9})(?=$|\D)

我仍然沒有得到理想的結果,因為包含它們的“數字”超過了9個字符。 如果我使用更多字符,最終將導致很多錯誤的結果。

我需要的是一種告訴正則表達式采用數字,空格和破折號但具有以下限制的方法:

  • 該數字只能為9個字符(無空格和破折號)
  • 一行中不能有兩個空格或破折號或它們的混合

此外,如果不返回破折號和空格,那將是很好的選擇,但是那並不那么重要

我建議使用

(?<!\d)\d(?:[ -]?\d){8}(?!\d)

參見regex演示 要僅匹配ASCII數字, RegexOptions.ECMAScript選項傳遞給regex構造函數。

圖案細節

  • (?<!\\d) -如果在當前位置的左邊緊接着有一個數字符號(與(?<=^|\\D)相同(?<!\\d) ,則負向后234.123 4567-89匹配234.123 4567-89注意 :避免匹配234.123 4567-89(?<!\\d\\.?)
  • \\d一個數字
  • (?:[ -]?\\d){8} -恰好出現8個空格或-再加上任何數字
  • (?!\\d) -如果當前位置的右側緊鄰有一個數字,則負向搜索將使匹配失敗( 注意 :為防止匹配123456789.34 ,請改用(?!\\.?\\d) )。

C#用法提取匹配項:

var results = Regex.Matches(s, @"(?<!\d)\d(?:[ -]?\d){8}(?!\d)", RegexOptions.ECMAScript)
    .Cast<Match>()
    .Select(m => m.Value)
    .ToList();

此正則表達式有效:

(\d\s?-?){9}

它正在尋找任意數字的9組,后跟可選的空格和可選的連字符。

因此,它將與您的所有示例匹配,但也將與以下示例匹配:

  • 1 2 3 4 5 6 7 8 9
  • 1 -2 -3 -4 -5 -6 -7 -8 -9-
  • 等等

這是一個簡單的正則表達式,但是如果您想排除帶有結尾空格或連字符的匹配項,則可能無法滿足您的要求。 WiktorStribiżew的答案提供了更復雜的正則表達式,可以更全面地滿足您的需求。

暫無
暫無

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

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