正则表达式在方括号外匹配文本

时间:2018-09-10 09:43:00

标签: c# regex

我目前正在使用此正则表达式,但可以弄清楚如何获取文本组以合并其结果。

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”成为文本组中的两个组。在我一生中添加。*?(..)时,似乎无法使文本组不干扰特殊组。

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();