我有以下输入:
!foo\[bar[bB]uz\[xx/
我希望匹配从开始到[
的所有内容,包括转义括号\[
,如果在[!#\s]
组中,则忽略第一个字符
预期产出:
foo\[bar
我试过了:
(?![!#\s])[^/\s]+\[
但它返回:
foo\[bar[bB]uz\[
答案 0 :(得分:0)
答案 1 :(得分:0)
答案 2 :(得分:0)
Java:使用Lookbehind
(?<=!)(?:\\\[|[a-z])+
请参阅regex demo
<强>解释强>
(?<=!)
断言当前位置之前的是!
(?:\\\[|[a-z])
匹配\[
或|
a
和z
之间的字母+
会导致群组匹配一次或多次<强>参考强>
答案 3 :(得分:0)
你可以尝试这种模式:
(?<=^[!#\s]{0,1000})(?:[^!#\s\\\[]|\\.)(?>[^\[\\]+|\\.)*(?=\[)
模式细节:
开头是一个lookbehind,意味着在字符串开头的前面有零个或几个禁止字符
(?:[^!#\s\\\[]|\\.)
确保第一个字符是允许的字符或转义的字符。
(?>[^\[\\]+|\\.)*
描述内容:所有不是[
或\
或转义字符。 (请注意,此子模式也可以这样写:(?:[^\[\\]|\\.)*
)
(?=\[)
检查下一个字符是文字开头方括号。 (因为所有转义字符都与先前组匹配,您可以确定此转义字符未被转义)
link to fiddle (按Java按钮)
答案 4 :(得分:0)