使用输入文本构造的正则表达式中的模式语法异常

时间:2015-05-15 01:41:52

标签: java regex

我在考虑目标令牌的同时逐行解析.txt。我使用正则表达式处理器引擎。

我将每一行匹配为:

"(^|.*[\\s])"+token+"([\\s].*|$)"

其中token是一个字符串。当:

token="6-7(3-7" 

出现以下异常:

Exception in thread "main" java.util.regex.PatternSyntaxException: 
Unclosed    group near index 27
(^|.*[\s])6-7(3-7([\s].*|$)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

您的令牌中有特殊字符。

查看Pattern.quote()

  

public static String quote(String s)

     

返回指定String的文字模式String。

     

此方法生成一个String,可用于创建一个与字符串s匹配的Pattern,就像它是一个文字模式一样。

     

输入序列中的元字符或转义序列没有特殊含义。

这应该适合你:

String pattern = "(^|.*[\\s])" + Pattern.quote(token) + "([\\s].*|$)";

不需要自己做魔术! : - )

答案 1 :(得分:1)

您应该确保在用于制作正则表达式模式的任何纯文本字符串中转义特殊字符。将"("替换为"\(",同样替换裸露的反斜杠(之前任何其他步骤),句点和所有其他特殊字符,至少是您希望在输入。 (如果它是来自用户的任意输入,则假设将包括每个字符。)