提问人:Manuel Pardo 提问时间:10/11/2023 最后编辑:Manuel Pardo 更新时间:10/11/2023 访问量:58
使用括号表示法提取多维键的正则表达式
Regex to extract multidimensional keys using bracket notation
问:
我需要使用纯正则表达式检索所有密钥。 我需要从单词字段开始,然后需要捕获所有多个键。
field[somevalue][anothervalue]
我正在使用这个正则表达式:/^field(?=\[(\w+)](?=\[(\w+)])?)/
但是我只能检索两个级别(somevalue 和 anothervalue)
我需要深入并检索其他级别,例如:
field[somevalue][anothervalue][other][some]...
所以我需要检索 somevalue、anothervalue、other、some 等,从变量名称字段开始
我不想使用这样的循环(正则表达式表示多维数组的括号表示法)
需要直接通过,在 https://regex101.com 中使用
答:
1赞
Bohemian
10/11/2023
#1
以落后或上一场比赛结束开始比赛():field
\G
(?<=field|\G)\[(.*?)]
观看现场演示。
评论
2赞
Cary Swoveland
10/11/2023
例如,如果字符串是 ,则存在问题,在这种情况下,即使 在 之前,也会匹配(以及 、 等)。演示 1.我相信您需要以下内容或类似内容:.演示 2"[cat]field[somevalue][anothervalue][other][some][aaa][bbb]"
"cat"
"somevalue"
"anothervalue"
"[cat]"
"field"
(?:(?<=field)|(?!^)\G)\[(.*?)]
0赞
Bohemian
10/11/2023
@CarySwoveland不是根据这两个网站:regexr.com/7lg2i 和 rubular.com/r/CkTIKDlTSDKOdj .我没有尝试其他网站。也许你能找到一个?
0赞
Cary Swoveland
10/11/2023
我不跟随。如果我添加到测试字符串的开头,则在 之前,在您的评论中的这两个链接中匹配和捕获。我只知道后面括在括号中的那些字符串将被提取(不是)。"[cat]"
"field"
"cat"
"field"
"cat"
2赞
The fourth bird
10/11/2023
#2
使用 pcre,如果“field”应该存在,则可以使用捕获组和锚点捕获方括号之间的单词字符:\G
(?:\bfield|\G(?!\A))\[(\w+)\]
该模式匹配:
(?:
备选方案的非捕获组:\bfield
单词边界,然后匹配“字段”|
或\G(?!\A)
在上一场比赛的末尾断言当前位置,而不是在字符串的开头
)
关闭非捕获组\[(\w+)\]
捕获组 1 中方括号之间的 1+ 单词字符
观看正则表达式演示。
或者使用不匹配的否定字符类在方括号之间进行更广泛的匹配:[
]
(?:\bfield|\G(?!\A))\[([^][]*)\]
查看另一个正则表达式演示。
0赞
Cary Swoveland
10/11/2023
#3
如果已知字符串中存在,则可以采用以下两种方法。"field"
#1 使用消极的展望
(?<=\[)[^]]*(?=])(?!.*\bfield)
#2 匹配不需要的字符串,匹配和捕获想要的字符串
.*\bfield\[|\]\[|([^\]]+)
使用这种方法时,匹配但未捕获的字符串将被丢弃;唯一感兴趣的匹配项是那些被(匹配和)捕获(以捕获组 1)的匹配项。
下一个:正则表达式从右到左提取
评论
pcre
(?:field|\G(?!\A))\[([^][]*)\]
(?:field|\G(?!\A))\[(\w+)\]
^field(?:\[(\w+)\])(?:\[(\w+)\])?(?:\[(\w+)\])?(?:\[(\w+)\])?(?:\[(\w+)\])?
(?:\bfield|(?<=\[).*?(?=]))
"field"