使用括号表示法提取多维键的正则表达式

Regex to extract multidimensional keys using bracket notation

提问人:Manuel Pardo 提问时间:10/11/2023 最后编辑:Manuel Pardo 更新时间:10/11/2023 访问量:58

问:

我需要使用纯正则表达式检索所有密钥。 我需要从单词字段开始,然后需要捕获所有多个键。

field[somevalue][anothervalue]

我正在使用这个正则表达式:/^field(?=\[(\w+)](?=\[(\w+)])?)/

但是我只能检索两个级别(somevalueanothervalue)

我需要深入并检索其他级别,例如:

field[somevalue][anothervalue][other][some]...

所以我需要检索 somevalueanothervalueothersome 等,从变量名称字段开始

我不想使用这样的循环(正则表达式表示多维数组的括号表示)

需要直接通过,在 https://regex101.com 中使用

正则表达式 regex-lookarounds pcre regex-greedy

评论

0赞 The fourth bird 10/11/2023
像这样与捕获组? 请参阅 regex101.com/r/DaDXh3/1pcre(?:field|\G(?!\A))\[([^][]*)\](?:field|\G(?!\A))\[(\w+)\]
0赞 AdrianHHH 10/11/2023
你到底想实现什么,你想用结果做什么?您希望使用哪种编程语言来使用结果?Regex101 很好,但它不是一种编程语言。
0赞 Jerry Jeremiah 10/11/2023
这适用于五个括号,但如果需要,可以添加更多括号: regex101.com/r/LGoFoQ/1^field(?:\[(\w+)\])(?:\[(\w+)\])?(?:\[(\w+)\])?(?:\[(\w+)\])?(?:\[(\w+)\])?
0赞 Cary Swoveland 10/11/2023
我知道您正在这里寻找正则表达式,但我想指出,如果您要扫描您可能会掉落的匹配项以及之前的任何匹配项。(?:\bfield|(?<=\[).*?(?=]))"field"

答:

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/7lg2irubular.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)的匹配项。