regex - 匹配特定单词及其后成对括号之间的字符串,支持单个嵌套级别,但有异常
问题描述
我对正则表达式匹配有疑问。我需要在字符串中找到特定的子字符串。一些例子:
1. IF[A != B; C[0]; D] ==> IF[A != B; C[0]; D]
2. IF[A != B; IF[E < F; ...; ...]; D] ==> IF[E < F; ...; ...]
3. IF[A != B; C; D] ==> IF[A != B; C; D]
所以,我有这个规则表达式:IF\[([^\[\]]*)\]
. 它在案例 2 和 3 中工作正常,但在案例 1C[0]
中包含方括号。
我试图以这种方式更改我的正则表达式:IF\[((?!IF))\]
和 finaly IF\[(.+(?!IF))\]
。我添加了一个展望,说它“保留不包含另一个 IF 的 IF”。现在它适用于案例 1 和 3,但案例 2 返回整个字符串。
如何创建正确的外观来解决这个问题?我需要在可以是整个字符串的字符串中找到最内部的 IF。
我已经在这个答案中尝试了解决方案:https ://stackoverflow.com/a/32747960/5731129
解决方案
您希望匹配IF[...]
子字符串,其中方括号之间的字符串可能包含另一对方括号,除非前面有一个IF
,只有一个嵌套括号级别。
为此,您可以使用
IF\[([^][]*(?:(?<!\bIF)\[[^][]*][^][]*)*)]
查看正则表达式演示
细节
IF\[
- 一个IF[
子串([^][]*(?:(?<!\bIF)\[[^][]*][^][]*)*)
- 第 1 组:[^][]*
- 0+ 字符除了[
和]
(?:(?<!\bIF)\[[^][]*][^][]*)*
- 0 次或多次出现(?<!\bIF)\[
- 一个[
不紧跟在整个单词前面的字符IF
(\b
是单词边界)[^][]*
- 0+ 字符除了[
和]
]
- 一个]
字符[^][]*
- 0+ 字符除了[
和]
]
- 一个]
字符。
推荐阅读
- javascript - 当鼠标悬停在其上时如何阻止 mouseOver 文本闪烁
- python-3.x - 如何为模型准备测试集形状。使用 keras 和 tensorflow 进行评估?
- sql - 为什么我操作非索引列时查询仍然那么快?
- kubernetes - Istio 缺少指标
- javascript - 如何阻止 JavaScript 生成一个只有 JS 函数调用的 HTML 文件
- c# - C#获取用于调试的api响应
- java - 如何解决方法调用“toString”可能产生“java.lang.NullPointerException”?
- python - 创建没有文件名的 Python 命名空间
- mysql - 将分隔值转换为逗号分隔列表
- python - 如果某个值存在,如何重新分配具有重复值的列的值?