刪除 Java 字串中的括號字符
1. 概述
在 Java 中處理String值時,有時我們需要透過刪除特定字元來清理資料。常見的情況是刪除括號字元。透過正確的方法,刪除這些字元可以很簡單。
在本教程中,我們將探討如何實現這一目標。
2.問題介紹
首先我們先先明確一下需求:什麼是括號字元?
如果我們關注 ASCII 字符,則有三對括號字符:
- 圓括號/圓括號 – '(' 和 ')'
- 方括號 – '[' 和 ']'
- 大括號 – '{' 和 '}'
除了這三對之外,我們在實務上也經常使用「<」和「>」作為尖括號,例如在 XML 標籤中。
然而,“<”和“>”實際上不是括號字元。它們被定義為“小於”和“大於”字元。但我們將把它們視為第四對括號字符,因為它們通常用作尖括號。
因此,我們的目標是從給定的String中刪除四對字元。
假設我們有一個String值:
static final String INPUT = "This (is) <a> [nice] {string}!";
正如我們所看到的, INPUT String包含所有八個括號字元。刪除所有括號字元後,我們預期會得到這樣的結果:
"This is a nice string!"
當然,我們的輸入可能包含Unicode字元。本教程也涉及 Unicode String場景。
接下來我們以INPUT為例,看看如何移除字元。
3. 使用StringUtils.replaceChars()方法
Apache Commons Lang 3 是一個廣泛使用的函式庫。這個函式庫中的StringUtils類別提供了一組豐富的幫助器方法,使我們能夠方便地操作字串。
例如,我們可以使用replaceChars()方法來解決我們的問題。這個方法可以讓我們一次替換多個字元。此外,我們可以用它來刪除字元:
String result = StringUtils.replaceChars(INPUT, "(){}[]<>", null);
assertEquals("This is a nice string!", result);
如上面的程式碼所示,我們傳遞String “(){}[]<>”作為searchChars參數,並傳遞null值作為replaceChars參數。這是因為**當replaceChars為null, replaceChars()會從輸入字串中刪除searchChars中包含的所有字元String.**因此, replaceChars()可以完成這項工作。
4.使用基於正規表示式的replaceAll()方法
正規表示式 (regex) 是用於匹配字串中的模式的強大工具,使我們能夠根據定義的條件高效地搜尋、替換和操作文字。
接下來,讓我們看看如何使用 Java 標準庫中基於正規表示式的replaceAll()方法刪除括號字元:
String regex = "[(){}<>\\[\\]]";
String result = INPUT.replaceAll(regex, "");
assertEquals("This is a nice string!", result);
正規表示式模式看起來非常簡單。它只有一種字元類,其中包括括號字元。
敏銳的眼睛可能會注意到,我們只轉義了字符類中的“ [ ”和“ ] ”字符,而保留“ (){}<> ”原樣。這是因為正則表達式按字面意思匹配字符類中的字符,這意味著字符類中的所有字符都會失去其特殊含義並且不需要轉義。
但是,由於「 [ 」和「 ] 」用於定義字元類別本身,因此我們必須對它們進行轉義,以區分它們作為字元類別分隔符號和類別中的文字字元的角色。
5. 刪除 Unicode 括號字符
我們已經了解如何從僅包含 ASCII 字元的String輸入中刪除括號字元。接下來,讓我們看看如何刪除 Unicode 括號字元。
假設我們有另一個包含 Unicode 和 ASCII 括號字元的String輸入:
static final String INPUT_WITH_UNICODE = "⟨T⟩❰h❱「i」⦇s⦈ (is) <a> [nice] {string}!";
如範例所示,除了 ASCII 括號字元「 (){}[]<> 」之外,它還包含以下 Unicode 字元:
我們的範例還沒有涵蓋更多 Unicode 括號字元。幸運的是,正規表示式支援 Unicode 類別匹配。
我們可以使用\p{Ps}和\p{Pe}來匹配所有左括號和右括號字元。
接下來,我們來看看這些類別是否可以告訴replaceAll()刪除所有括號字元:
String regex = "\\p{Ps}|\\p{Pe}";
String result = INPUT.replaceAll(regex, "");
assertEquals("This is <a> nice string!", result);
String resultWithUnicode = INPUT_WITH_UNICODE.replaceAll(regex, "");
assertEquals("This is <a> nice string!", resultWithUnicode);
上面的測試顯示大多數字元括號已被刪除。但是, ASCII 字元“ < ”和“ > ”保留。這是因為「 < 」和「 > 」被定義為「小於」和「大於」而不是尖括號。也就是說,它們不屬於括號類別,且不被正規表示式相符。
如果我們想要刪除' < '和' > ',我們可以將字元類別「 [<>] 」新增到模式中:
String regex = "\\p{Ps}|\\p{Pe}|[<>]";
String result = INPUT.replaceAll(regex, "");
assertEquals("This is a nice string!", result);
String resultWithUnicode = INPUT_WITH_UNICODE.replaceAll(regex, "");
assertEquals("This is a nice string!", resultWithUnicode);
可以看到,這一次,我們得到了預期的結果。
六,結論
在本文中,我們探索了從輸入String中刪除括號字元的不同方法,並透過範例討論如何刪除 Unicode 括號。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。