带有内部表达式

时间:2015-12-29 11:23:06

标签: java regex

我有示例表达式:

firstName =:'Mon';lastName =:'Arthur';:or{size >:'20';lastName ^:'H';:and{company |:'lon';:or{company |:'we'}}};lastName =:'aa';:and{length >:'33';:or{color =:'red'};width <:'2'};date <:'2012';:!{source =:'dictionary,locale'}

和正则表达式必须匹配:

  1. :或{size&gt;:'20'; lastName ^:'H';:and {company |:'lon';:或{company |:'we'}}}
  2. :和{length&gt;:'33';:或{color =:'red'}; width&lt;:'2'}
  3. :!{source =:'dictionary,locale'}
  4. 因此正则表达式必须与以“:[anycharacters]{”开头并以'}'结尾的表达式匹配,并且该圆括号之间的表达式也可能包含可匹配的内部表达式。

    我试着写点东西: https://regex101.com/r/gM3dR9/13 并且回报是:

    1. :或{size&gt;:'20'; lastName ^:'H';:和{company |:'lon';:或{company |:'we'} - 确定
    2. :和{length&gt;:'33';:或{color =:'red'} -MISSING ;width <:'2'}
    3. :!{source =:'dictionary,locale'} -OK

2 个答案:

答案 0 :(得分:1)

我试图找出一个适合你的例子和你写的要求的解决方案,但我不确定,如果我完全得到它:

(?:;:)(\S+(?:{.*?}(?=[^}]*$|;[^}]*;:)))

这使用正向前瞻以确保正确捕获最后一个右括号(必须后跟字符串的末尾或另一个;:

如果可能,您的匹配是字符串的开头,因此;:不能继续进行,您可以将部分(?:;:)更改为(?:^|;:)

以下是Regex101的链接:https://regex101.com/r/dV8uI4/1

答案 1 :(得分:0)

试试这个regEx

(:or{.*?\};{1,})|(:and{.*\};)|(:!{.*?\};{0,})

我无法保证任何其他复杂的情况,但绝对是你提到的输出除了额外&#39 ;;&#39;

"firstName =:'Mon';lastName =:'Arthur';:or{size >:'20';lastName ^:'H';:and{company |:'lon';:or{company |:'we'}}};lastName =:'aa';:and{length >:'33';:or{color =:'red'};:width <:'2'};date <:'2012';:!{source =:'dictionary,locale'}".match(/(:or{.*?\};{1,})|(:and{.*\};)|(:!{.*?\};{0,})/g)

<强>输出

[":or{size >:'20';lastName ^:'H';:and{company |:'lon';:or{company |:'we'}}};", ":and{length >:'33';:or{color =:'red'};:width <:'2'};", ":!{source =:'dictionary,locale'}"]

格式化输出

[
":or{size >:'20';lastName ^:'H';:and{company |:'lon';:or{company |:'we'}}};",
":and{length >:'33';:or{color =:'red'};:width <:'2'};",
":!{source =:'dictionary,locale'}"
]

tested Here - Java RegEx Tester