我有这样的文字:
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}))
答案 0 :(得分:0)
在@bobble bubble's comment上展开,这是我的正则表达式:
它将捕获三元函数的第一层。捕获组:$ 1是有条件的,$ 2是true子句,$ 3是false子句。然后,您必须在每个正则表达式上匹配正则表达式,以进一步深入树中:
[GET] localhost:8080/myapp/customers
也就是说,如果您还要在这些表达式中评估数学,那么使用运行时编译器为您完成所有繁重的工作可能会更有价值。如果您愿意,This answer将帮助您朝这个方向进行设计。
答案 1 :(得分:-2)
如果我理解正确,并且我们希望仅捕获两种列出的格式,那么我们可以从使用交替的简单表达式开始,然后,如果需要的话,可以修改其间隔:
UseProp1|(\(?Prop1\?Prop1(:Test)\)):(\(UseProp2\?Prop2):\((Test\sText):\s+'\{(.+?)}'\s+Test\sReference:\{(.+?)}\)\)
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);
}
}
}
如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。
jex.im可视化正则表达式: