我正在尝试为 linter 构建一个(多行)模式,以捕捉以下情况:
Text(
声明.appFont(
声明...}
(函数结束)或 Text(
(另一个文本声明...)之前在使用 regex101(并咨询 gpt...)数小时后,我得到了这些 2:
Text\([\s\S]*?\)[\s\S]*?(?!\.appFont)
这只是捕捉到
.appFont
之前的部分,但如果发现.appFont
,我希望整个捕捉失败...
Text\([\s\S]*?\)[\s]*?(?!appFont)[\s\S]\}
这只是抓住了一切,忽略了
appFont
完全处于刺中......
在下面的例子中,只有第二种情况应该被捕获:
Text("blah")
.appFont(.body)
}
Text("blah")
}
Text(
"blah"
)
.appFont(.blah)
}
我试图阅读有关负面前瞻的内容,但我认为我仍然以某种方式错误地使用它,或者以某种方式导致它在我添加时被忽略
[\s\S]
也许?
Text\([^)]*\)(?:(?!\.appFont)[^}])*}
在 regex101 看到这个演示 - 有点类似于tempered greedy token.
正则表达式 | 解释 |
---|---|
|
匹配子串 |
|
匹配 然后是任意数量的非 否定类直到下一次关闭
|
|
非捕获组 重复 任意数量 包含: A neg. lookahead 如果子串 } 不领先。消耗成功每个匹配字符最多
|
}
)
- 在这里甚至可能更有效率。
Text\([^)]*\)(?![^}]*?\.appFont)[^}]*}
Text
任何数量)
look\.appFont
非匹配子串 | |
匹配 然后是 | 的非 ( 直到下一次关闭)
|
否定。先行(condition): | 如果(?![^}]*?\.appFont) 不领先,[^}]*?\.appFont 匹配lazily 任意数量的non- [^}]*? 直到子串}
|
如果条件成功(不是提前)消耗任意数量的 | [^}]*} 直到}
|