如何编写一个接受包含除“[
”之外的任意数量字符的表达式的正则表达式,除非“[
”前面带有“\
”?
示例:
this is text \\[ this also [$ this isn't any more
从上面的文字中,应该接受“this is text \\[ this also
”,其余的不应该被接受。我写了类似的东西:
[.[^\\\\[]]*
排除“[
”,但不知道如何允许它包含“\\[
”以及文本的其余部分。
答案 0 :(得分:5)
这将匹配所有不等于[
或等于[
\
前面的([^\[]|(?<=\\)\[)+
字符:
^([^\[]|(?<=\\)\[)+$
如果您想要对整个字符串进行简单的传递/失败,只需将开始/结束行字符添加到正则表达式:
{{1}}
答案 1 :(得分:4)
([^\[]|\\\[)*
这接受一系列((除[
之外的任何事物)或(\[
))。
通常,如果您想接受某些字符需要转义的字符串,例如abcd
,匹配它的正则表达式是:
([^abcd]|\\[abcd])*
修改强>
此正则表达式可与Matcher.find
一起使用,以迭代[]
内/外的所有部分:
\[(?:[^\[]|\\\[)*\]|(?:\\\[|[^\[])+
(将所有反斜杠放在Java字符串中时加倍;我将它们遗漏以便易读。)
这会将字符串abc[ def \[ asd \] ]\[ dasd[ \] ]
拆分为abc
,[ def \[ asd \] ]
,\[ dasd
和[ \] ]
。