匹配"****"或[****]之间的所有内容
我有一个看起来像这样的正则表达式:
(?="(test)"s*:s*(".*?"|[.*?]))
匹配"..."或之间的值[...]
输入
"test":"value0"
"test":["value1", "value2"]
输出
Group1 Group2
test value0
test "value1", "value2" // or - value1", "value2
我有什么技巧可以忽略""并[]坚持两组,group1并且group2?
我试过了,(?="(test)"s*:s*(?="(.*?)"|[(.*?)]))但这给了我 4 个组,这对我不利。
回答
您可以在带有分支重置组的PHP 中使用此条件正则表达式:
"(test)"h*:h*(?|"([^"]*)"|[([^]]*)])
这将为您提供两个带有封闭"或的输入中的捕获组[...]。
正则表达式演示
正则表达式详情:
(?|..)是一个分支复位组。在此构造的每个替代项中声明的子模式将从相同的索引重新开始(?|"([^"]*)"|[([^]]*)])是if-then-else条件子模式,这意味着如果"匹配则使用"([^"]*)"否则使用[([^]]*)]子模式
- I am well aware of these techniques to build a regex. I didn't check series of comments below question earlier.