[英]Regex to check for match and split string
給定以下格式的字符串:
xxx (aaa - bbb - CC-dd - ee-FFF)
如果括號內有超過3個“ - ”字符串,我需要編寫一個返回匹配的正則表達式。
它還需要拆分字符串(通過“ - ” - 空格,連字符,空格)並在單獨的匹配中返回每個組。 所以給定上面的字符串,我希望以下匹配:
我有以下正則表達式...
\((([\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個或更多文本片段。
我該怎么做:
\\(([^\\)]+)\\)
這看起來比一個巨大的正則表達式更易於維護,並且在性能方面應該是等效的,如果不是更快的話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.