Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 匹配“之间的所有内容”****&引用;或[*****]_Regex - Fatal编程技术网

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
    -清除当前整体匹配内存缓冲区的匹配重置运算符(组值仍保持不变)
  • (?|“\K([^”]*)|\[\K([^]]*))
    -a:
    • “\K([^”]*)
      -匹配一个
      ,然后丢弃它,然后捕获到组2
      之外的零个或多个字符
    • |
      -或
    • \[\K([^]]*)
      -匹配一个
      [
      ,然后丢弃它,然后在组2中捕获除
      ]以外的零个或多个字符。
在Java中,不能使用
\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
    条件子模式,这意味着如果匹配了
    ,则使用
    “([^”]*)”
    否则使用
    \[([^]*])
    子模式

你能提供一些示例输入和预期输出吗?不过为了理解你想做什么,我编辑了我的问题@DominikYes,
“(测试)”\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