我目前正在使用此正则表达式,但可以弄清楚如何获取文本组以合并其结果。
String: Text 1^%+{TAB}({CMD 1}{CMD 2})Text 2.^(abc)
Regex: (?<special>[\^+%]*?[\(][^)]*[\)])|(?<special>[\^+%]*?[\{][^}]*[\}])|(?<text>.)
Result:
text: T
text: e
text: x
text: t
text:
text: 1
special: ^%+{TAB}
special: ({CMD 1}{CMD 2})
text: T
text: e
text: x
text: t
text:
text: 2
special: ^(abc)
Wanted:
text: Text 1
special: ^%+{TAB}
special: ({CMD 1}{CMD 2})
text: Text 2
special: ^(abc)
最终,我希望“文本1”和“文本2”成为文本组中的两个组。在我一生中添加。*?(..)时,似乎无法使文本组不干扰特殊组。
答案 0 :(得分:1)
您可以使用
(?<special>[+^%]*(?:\([^)]*\)|{[^}]*}))|(?<text>[\w\s]+)
请参见regex demo。
详细信息
(?<special>[+^%]*(?:\([^)]*\)|{[^}]*}))
-组“特殊”捕获:
[+^%]*
-零个或多个+
,^
或%
个字符(?:
-与两个备选方案之一匹配的non-capturing group:
\([^)]*\)
-一个(
,然后是除)
以外的0+个字符,然后是)
|
-或{[^}]*}
-一个{
,然后是除}
以外的0+个字符,然后是}
)
-非捕获组的结尾。|
-或(?<text>[\w\s]+)
-组“文本”:一个或多个单词或空格字符。答案 1 :(得分:0)
尝试以下操作:
string input = "Text 1^%+{TAB}({CMD 1}{CMD 2})Text 2.^(abc)";
string pattern = @"^(?'text1'[^\^]+)(?'special1'[^\(]+)(?'special2'[^\)]+\))(?'text2'[^\^]+)(?'special3'.*)";
Match match = Regex.Match(input, pattern);
Console.WriteLine("Text : '{0}' Special : '{1}' Special : '{2}' Text : '{3}' Special : '{4}'",
match.Groups["text1"].Value,
match.Groups["special1"].Value,
match.Groups["special2"].Value,
match.Groups["text2"].Value,
match.Groups["special3"].Value
);
Console.ReadLine();