2011-04-12 182 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