在没有递归或平衡组的情况下匹配嵌套括号
使用正则表达式匹配嵌套括号可能具有挑战性,特别是在像 Java 这样的语言中,递归且不支持平衡组。幸运的是,使用前向引用确实可以克服此限制。
匹配外部组
以下正则表达式 [1] 匹配外部组括号而不对深度施加限制:
(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
这里,表达式向前查找左括号,排除不匹配的左括号,并捕获相应的右括号。捕获的子字符串虽然无用,但可以作为占位符来完成匹配。
匹配内部组
要包含内部组,我们可以捕获以下表达式 [2]:
(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))
通过添加捕获组并调整反向引用索引,此表达式也捕获内部组。
工作原理
该方法迭代字符串,匹配下一个左括号和右括号,同时捕获每种情况下的剩余字符串。前瞻确保括号以平衡方式匹配。
表达式构造如下:
Component | Description |
---|---|
(?=() | Asserts that '(' precedes complex parsing |
(?: | Start of non-capturing group for repeated string processing |
(?= | Assert that the next '(' follows |
.?((?!.?1) | Match until the next '(' not followed by group 1 |
(.)(?!.2).* | Fill group 1 with the string, ensuring another ')' exists |
) | Assert that the matching ')' is valid |
.?)(?!.?2) | Assert that the next ')' not followed by group 2 exists |
(.*) | Fill group 2 with the remaining string |
) | Assert that the matching ')' is valid |
Consume a single character to continue matching within the group | |
) ? | Repeat the group (in the inner loop) |
.*?(?=1) | Match up to and including the last '(' found |
1*(?=2$) | Match up to the last ')' (but within the valid group) |
此方法可以高效匹配嵌套括号,无需递归或平衡组。
以上是嵌套括号可以在没有递归或平衡组的情况下匹配吗?的详细内容。更多信息请关注PHP中文网其他相关文章!