簡體   English   中英

正則表達式不包括方括號

[英]Regex excluding square brackets

我是正則表達式的新手。 我有這個正則表達式:

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

基本上它應該采取這個:

[[a][b][[c]]]

並能夠替換為:

[dd[d]]

abc,d是無關的。 不用說正則表達式不起作用。 在這種情況下,它用“d”替換整個字符串。

任何解釋或幫助都會很棒!

編輯:

我嘗試了另一個正則表達式,

\[([^\]]{0})\]

這個適用於括號不包含內括號而內部沒有其他內容的情況。 但它不適用於所描述的情況。

你需要知道這一點. dot是特殊字符,表示“新線標旁邊的任何字符”, *是貪婪的,所以它會嘗試找到最大匹配。

在你的正則表達式\\[(.*[^(\\]|\\[)].*)\\] .*將代表[[^(\\]|\\[)].*)\\]]之間的最大字符集[^(\\]|\\[)].*)\\]]這部分可以理解為非[]字符,可選的其他字符.*最后] 所以這個正則表達式將匹配您的整個輸入。


要擺脫這個問題,請從你的正則表達式中刪除.* 您也不需要使用| ( )[^...]

System.out.println("[[a][b][[c]]]".replaceAll("\\[[^\\]\\[]\\]", "d"));

輸出: [dd[d]]

\\[(\\[a\\])(\\[b\\])\\[(\\[c\\])\\]\\]

如果需要在當前上下文中加倍反斜杠(例如將其放在“”樣式字符串中):

\\\\[(\\\\[a\\\\])(\\\\[b\\\\])\\\\[(\\\\[c\\\\])\\\\]\\\\]

abc替換示例是[^\\]]* ,或者如果需要轉義反斜杠[^\\\\]]*

現在你可以替換捕獲一個,捕獲兩個並用d捕獲三個。


如果您要替換的字符串不完全是那種格式,那么您希望用全局替換

(\\[a\\])

替換a

(\\[[^\\]]*\\])

加倍反斜杠,

(\\\\[[^\\\\]]*\\\\])

試試這個:

System.out.println("[[a][b][[c]]]".replaceAll("\\[[^]\\[]]", "d"));

如果a,b,c在真實世界中有多個字符,請使用:

System.out.println("[[a][b][[c]]]".replaceAll("\\[[^]\\[]++]", "d"));

我們的想法是使用包含所有字符的字符類,但[] 該類是: [^]\\\\[]和模式中的其他方括號是文字。

請注意,字符結束方括號不需要在字符類的第一個位置和字符類之外進行轉義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM