2015-10-20 127 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