如何在嵌套括号内排除正则表达式匹配

时间:2019-06-06 19:01:14

标签: c# regex nested

我有这样的文字:

UseProp1?(Prop1?Prop1:Test):(UseProp2?Prop2:(Test Text: '{TextProperty}' Test Reference:{Reference}))

我正在尝试在C#中使用正则表达式来提取嵌套的if / else-segments。

要查找“?”我用过:

模式1:\?\s*(?![^()]*\))

并找到':'我用过:

模式2:\:\s*(?![^()]*\))

这在只有一层括号时有效,但在嵌套时却没有。

我已使用此在线工具简化了测试:http://regexstorm.net/tester(并插入pattern-1和上面的输入)

如您所见,它突出显示了两个匹配项,但我只想要第一个。您还会注意到,第一个括号被忽略了,但是下一个带有嵌套级别的括号被忽略了

我希望匹配列表为:

1)UseProp1

2)(Prop1?Prop1:Test):( UseProp2?Prop2 :(测试文本:'{TextProperty}'测试参考:{Reference}))

我现在得到的是:

1)UseProp1

2)(Prop1?Prop1:Test):( UseProp2

3)Prop2 :(测试文本:“ {TextProperty}”测试参考:{Reference}))

2 个答案:

答案 0 :(得分:0)

@bobble bubble's comment上展开,这是我的正则表达式:

它将捕获三元函数的第一层。捕获组:$ 1是有条件的,$ 2是true子句,$ 3是false子句。然后,您必须在每个正则表达式上匹配正则表达式,以进一步深入树中:

[GET] localhost:8080/myapp/customers

Code in Tester

也就是说,如果您还要在这些表达式中评估数学,那么使用运行时编译器为您完成所有繁重的工作可能会更有价值。如果您愿意,This answer将帮助您朝这个方向进行设计。

答案 1 :(得分:-2)

如果我理解正确,并且我们希望仅捕获两种列出的格式,那么我们可以从使用交替的简单表达式开始,然后,如果需要的话,可以修改其间隔:

UseProp1|(\(?Prop1\?Prop1(:Test)\)):(\(UseProp2\?Prop2):\((Test\sText):\s+'\{(.+?)}'\s+Test\sReference:\{(.+?)}\)\)

Demo

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"UseProp1|(\(?Prop1\?Prop1(:Test)\)):(\(UseProp2\?Prop2):\((Test\sText):\s+'\{(.+?)}'\s+Test\sReference:\{(.+?)}\)\)";
        string input = @"UseProp1
(Prop1?Prop1:Test):(UseProp2?Prop2:(Test Text: '{TextProperty}' Test Reference:{Reference}))
";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

RegEx

如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。

RegEx电路

jex.im可视化正则表达式:

enter image description here