簡體   English   中英

正則表達式檢查匹配和拆分字符串

[英]Regex to check for match and split string

給定以下格式的字符串:

xxx (aaa - bbb - CC-dd - ee-FFF)

如果括號內有超過3個“ - ”字符串,我需要編寫一個返回匹配的正則表達式。

它還需要拆分字符串(通過“ - ” - 空格,連字符,空格)並在單獨的匹配中返回每個組。 所以給定上面的字符串,我希望以下匹配:

  1. AAA
  2. BBB
  3. CC-DD
  4. EE-FFF

我有以下正則表達式...

\((([\w]).*(.[-].*?){3,}([\w]))\)

但我正在努力拆分字符串並返回我需要的匹配項。

您可以使用基於調和貪婪令牌的正則表達式:

\((?<o>(?:(?! - )[^()])+)(?: - (?<o>(?:(?! - )[^()])+)){3,}\)

請參閱正則表達式演示

細節

  • \\( - a ( char
  • (?<o>(?:(?! - )[^()])+) - 組“o”:除()之外的任何字符,1次或多次出現,不啟動space-space序列
  • (?: - (?<o>(?:(?! - )[^()])+)){3,} - 三次或更多次出現
    • - - 空間-空間
    • (?<o>(?:(?! - )[^()])+) - 組“o”:除()之外的任何字符,1次或多次出現,不啟動space-space序列
  • \\) - a ) char

獲取所有Group“o”捕獲以提取值。

C#demo

var s = "xxx (aaa - bbb CC - dd - ee-FFF) (aaa2 - bbb2 CC2- dd2- ee2-FFF2)";
var pattern = @"\((?<o>(?:(?! - )[^()])+)(?: - (?<o>(?:(?! - )[^()])+)){3,}\)";
var ms = Regex.Matches(s, pattern);
foreach (Match m in ms) 
{
    Console.WriteLine($"Matched: {m.Value}");
    var res = m.Groups["o"].Captures.Cast<Capture>().Select(x => x.Value);
    Console.WriteLine(string.Join("; ", res));
}

輸出:

Matched: (aaa - bbb CC - dd - ee-FFF)
aaa; bbb CC; dd; ee-FFF

這個問題可以這樣重寫:

您需要使用“ - ”作為分隔符在括號之間拆分文本,並確定是否有4個或更多文本片段。

我該怎么做:

  1. 使用正則表達式來獲取文本,例如: \\(([^\\)]+)\\)
  2. 使用String.Split(“ - ”)拆分匹配的文本
  3. 檢查返回數組中的元素數是否> 3

這看起來比一個巨大的正則表達式更易於維護,並且在性能方面應該是等效的,如果不是更快的話。

暫無
暫無

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

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