2015-10-20 126 views
3

我需要捕获文本中的所有#字符,除了那些被#[ ... #]包围的字符。 我写了PCRE版本(online example),它很好用,但Java不支持(* SKIP)(* FAIL)。Java正则表达式跳过匹配

#\[.*#\](*SKIP)(*FAIL)|# 

有没有这个正则表达式的Java等价物?谢谢。

+1

给你想要一个字符串的例子匹配。 –

+2

@ jamesjelo4kul:我的问题中有一个链接。我添加了一些文字以获得更好的想象力。 – sssss

+0

@anubhava:只需捕捉,然后我可以用Java替换它... – sssss

回答

2

它使用一个小窍门,以匹配你不想先#秒,然后休息一个捕获组匹配:

#\[.*?#\]|(#+)

https://regex101.com/r/sU1kR2/1

你需要解压首先捕获组以获得期望的#s。

如果你想要捕捉的每个个体#没有的或定制托架部分,你可以从捕获组降+如下:

#\[.*?#\]|(#)

而且,如果你能有这样的文字##[text]#,那么你可能如下需要环视:

#\[.*?#\]|(#(?!\[))

如果你可以使用\K(但我不认为你可以在Java),因为这样你就不必担心捕获组是即使有以下简单:

#\[.*?#\]\K|#

+0

最后的解决方案非常好,但是我不能在Java中使用'\ K'。第一个工作,谢谢。 – sssss

+0

如果托架未正确形成,它如何失败?法律表达方式是'#[这一个是#ok#]'。 – lintmouse

+0

@MaxZoom - 好的,但看看我的财产形成结束括号时会发生什么:https://regex101.com/r/sU1kR2/3。 – lintmouse