我正在尝试为linter构建一个(多行)模式,以捕获以下情况:
Text(
声明
1.也就是not后跟.appFont(
声明...
1....在下一次出现}
(函数结束)或Text(
(另一个Text声明...)之前
在regex101上花了几个小时(并咨询了gpt...),我得到了以下两个:
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]
也许?
1条答案
按热度按时间but5z9lq1#
使用否定字符类和 negativelookahead。
See this demo at regex101-有点类似于tempered greedy token。
| 正则表达式|解释|
| --------------|--------------|
|
Text
|匹配子串||
\([^)]*\)
|匹配(
,后跟非)
的any amount * 否定类 * 直到下一个关闭)
||
(?:(?!\.appFont)[^}])*}
|(?:
non capturing group)
重复*
any amount次,包含:(?!\.appFont)
一个 neg.lookahead,它在每个非}
的前面检查子字符串\.appFont
是否不在前面- * 消耗 * 成功时每个匹配字符,直到}
|或者在关闭
)
后只使用一次lookaheadAssert。Another demo at regex101-在这里甚至可能更有效。
| 正则表达式|解释|
| --------------|--------------|
|
Text
|匹配子串||
\([^)]*\)
|匹配非)
的(
,然后是any amount,直到下一个关闭)
||
(?![^}]*?\.appFont)
|neg. lookahead(condition):look如果[^}]*?\.appFont
不在前面,其中[^}]*?
匹配非}
的lazilyany amount,直到子字符串\.appFont
||
[^}]*}
|如果条件成功(它不是提前)消耗any amount的非}
到}
|