2011-04-12 103 views
35

正則表達式什麼是匹配字符串中的正則表達式「(」匹配括號

以下是該方案:

我有一個字符串

str = "abc(efg)"; 

我想分割在'('使用正則表達式的字符串。對於我正在使用

Arrays.asList(Pattern.compile("/(").split(str)) 

但我得到以下例外。

java.util.regex.PatternSyntaxException: Unclosed group near index 2 
/(

轉義'('似乎不工作。

+0

您使用哪種語言? – Kobi 2011-04-12 10:11:41

+0

我正在使用Java – Ammu 2011-04-12 10:40:13

+6

嘗試使用'Pattern.quote(「(」)'或簡單地使用'「\\(」'。注意,有兩個反斜槓 - 爲Java編譯器增加一個反斜槓,以正確理解字符串。您的示例代碼使用斜槓,而不是反斜槓。更重要的是,你可以簡單的使用'string.split' ... – Kobi 2011-04-12 10:57:51

回答

66

兩個選項:

首先,你可以用一個反斜槓轉義 - \(

或者,因爲它是一個單一的字符,你可以把它放在一個字符類,它不需要轉義 - [(]

+6

[(]爲'sed'做伎倆] – rodowi 2014-04-11 02:08:22

2

對於任何特殊字符,您應該使用'\'。 所以,匹配括號 - 。/ \(/

4
  • 您可以通過使用一個反斜槓逃脫任何元字符,這樣你就可以與模式匹配( \(
  • 許多語言都配備了建設 - 逃脫的功能,例如,NET的Regex.Escape或Java的Pattern.quote
  • 一些香精支持\Q\E,它們之間的文字文本。
  • 一些香精(VIM,例如)匹配01從字面上看,,並要求\(捕獲組。

參見:Regular Expression Basic Syntax Reference

1

因爲(在正則表達式中是特殊的,所以喲你應該在匹配時跳過它\(。但是,根據您使用的語言,您可以輕鬆地將(與字符串方法(如index())或其他方法相匹配,以便您找到(所在的位置。有時,不需要使用正則表達式。

3

該解決方案由一個正則表達式匹配打開和關閉括號中的Java 8的風格

String str = "Your(String)"; 
// parameter inside split method is the pattern that matches opened and closed parenthesis, 
// that means all characters inside "[ ]" escaping parenthesis with "\\" -> "[\\(\\)]" 
String[] parts = str.split("[\\(\\)]"); 
for (String part : parts) { 
    // I print first "Your", in the second round trip "String" 
    System.out.println(part); 
} 

寫作,這可以通過這種方式來解決:

Arrays.asList("Your(String)".split("[\\(\\)]")) 
    .forEach(System.out::println); 

我希望這是顯而易見的。

+1

關於發生了什麼事的解釋如果OP不知道這樣做的話,他們可能也不會理解你的解決方案,一般來說,只包含代碼或鏈接的答案不是很好的答案 – Totem 2015-05-08 00:35:23