Regex 匹配“之间的所有内容”****&引用;或[*****]
我有一个正则表达式,看起来: 要匹配Regex 匹配“之间的所有内容”****&引用;或[*****],regex,Regex,我有一个正则表达式,看起来: 要匹配“…”或[…] 输入 输出 Group1 Group2 test value0 test "value1", "value2" // or - value1", "value2 我有什么窍门可以忽略“和[]而坚持两组,group1和group2 我尝试了(?=“(test)”\s*:\s*(?=”(.*?)\[(.*?),但这给了我4个组,这对我不好。您可以使用如下模
“…”
或[…]
输入
输出
Group1 Group2
test value0
test "value1", "value2" // or - value1", "value2
我有什么窍门可以忽略“
和[]
而坚持两组,group1
和group2
我尝试了
(?=“(test)”\s*:\s*(?=”(.*?)\[(.*?)
,但这给了我4个组,这对我不好。您可以使用如下模式
“(测试)”\s*:\s*\K(?|“\K([^”]*)\[\K([^]*))
看
详情:
-a“
字符”
-第1组:(测试)
测试
-a“
字符”
-用零个或多个空格括起来的冒号\s*:\s*
-清除当前整体匹配内存缓冲区的匹配重置运算符(组值仍保持不变)\K
-a:(?|“\K([^”]*)|\[\K([^]]*))
-匹配一个“\K([^”]*)
,然后丢弃它,然后捕获到组2除”
之外的零个或多个字符“
-或|
-匹配一个\[\K([^]]*)
,然后丢弃它,然后在组2中捕获除[
]以外的零个或多个字符。
\K
和?|
,请使用捕获组:
String s=“\“test\”:[\“value1\”,\“value2\”];
模式模式=模式。编译(“\“(测试)\”\\s*:\\s*(?:\”([^\“]*))\\[([^\]])”);
匹配器匹配器=模式匹配器;
while(matcher.find()){
System.out.println(“键:+matcher.group(1));
if(匹配器组(2)!=null){
System.out.println(“值:+matcher.group(2));
}否则{
System.out.println(“值:+matcher.group(3));
}
}
请参阅。您可以在PHP中将此条件正则表达式与分支重置组一起使用:
“(测试)”\h*:\h*(?|“([^”]*)“| \[([^]]*))
这将在两个输入中为您提供两个捕获组,其中包含“
或[…]
正则表达式详细信息:
是一个分支重置组。在这里,此构造的每个备选方案中声明的子模式将从同一索引重新开始(?|…)
是(?|“([^”]*)“\[([^]*])
条件子模式,这意味着如果匹配了如果then-else
,则使用”
否则使用“([^”]*)”
子模式\[([^]*])
“(测试)”\s*:\s*(?|“*”([^“]*)“| \[([^]*))
。看。这很好@WiktorStribiżew:),有没有办法使用前瞻来点燃未使用的部件?比如“test”\s*:\s*\K(?“\K[^”]*\[\K[^]*)
?很抱歉,哪些部分是“未使用的”?我非常了解构建正则表达式的这些技术。我之前没有检查下面问题的一系列评论。@WiktorStribiżew和anubhava,如果你不介意的话,(?|
分支重置组。Java中是否有类似的方法,我尝试了Java中的解决方案,但我发现了一个例外?@YCFżL不,没有。坚持使用没有任何\K
或的组(?)regex@YCF_L我添加了Java演示。
"test":"value0"
"test":["value1", "value2"]
Group1 Group2
test value0
test "value1", "value2" // or - value1", "value2