正则表达式:排除[,除非其前面有\。

9

如何编写一个正则表达式,以接受包含任意数量的任何字符的表达式,但不包括 '[',除非 '[' 前面有 '\'?

示例:

this is text \\[ this also [$ this isn't any more    

从上面的文本中,"this is text \\[ this also" 应该被接受,其他的不应该。我写了类似下面的内容:
[.[^\\\\[]]*  

希望排除 '[',但不知道如何允许它包含 '\\[' 和其他文本。

2个回答

5

这将匹配所有不等于[或等于\前面的[的字符:

([^\[]|(?<=\\)\[)+

如果您想对整个字符串进行简单的通过/失败检查,只需将起始/结束行字符添加到正则表达式中即可:
^([^\[]|(?<=\\)\[)+$

这个做得不错,只是在“[^[]”中的“[”前面缺少了一个“\”。谢谢。 - Carkak Vognema
修正了我的答案。在所有的正则表达式实现中,\\并不是必需的,因为在给定的上下文中它是一个字符类,但我不熟悉Java正则表达式。 - woemler
1
是的,这似乎有效。以下是用于Java字符串的转义版本:[^\\[]|(?<=\\\\)\\[)+ - Duncan Jones

4
([^\[]|\\\[)*

这个正则表达式接受一个由 ((除了[)或(\[)组成的序列。

一般来说,如果你想接受一个字符串,其中某些字符需要转义,例如abcd,与之匹配的正则表达式是:

([^abcd]|\\[abcd])*

编辑:

这个正则表达式可以使用 Matcher.find 遍历所有在/不在 [] 中的部分:

\[(?:[^\[]|\\\[)*\]|(?:\\\[|[^\[])+

当将其放入Java字符串时,请将所有反斜杠都加倍; 我为了易读性而省略了它们。

这将把字符串abc[ def \[ asd \] ]\[ dasd[ \] ]拆分成abc[ def \[ asd \] ]\[ dasd[ \] ]


如果我输入"first \[ second [ third",这会给我输出"first "," second "," third",但我想要的是"first \[ second ", " third"。因此,我希望\[包含在表达式中,而[标记表达式的结束。 - Carkak Vognema
3
看起来你的最终目标是拆分一个字符串,但我不确定你的标准是什么(是通过 \\[ 进行拆分吗?)。你能否更新你的答案,提供更多关于你想要实现的细节?这可能是一个 XY 问题。 - ebsddd
抱歉。是的,我的最终目标是拆分字符串。更详细地说,我需要将其拆分为两种类型的段落:以'['开头并以']'结尾的段落和这些段落之外的段落。但是,第二个类型的段落如果在其前面加上'\',它可能包含'['。因此,这意味着第二类型的段落可以是"first \[ second",但不能是"first [ second"。所以,我只问了问题的一部分:如果一个段落包含'\[',则保留该段落,否则丢弃以'['开头的段落。嗯,我不明白它如何符合XY的要求。 - Carkak Vognema
你测试过你的解决方案吗?我正在努力让它工作。也许你可以将你的模式转义,就像在Java字符串中使用一样? - Duncan Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接