Java 使用输入文本构造的正则表达式中的模式语法异常
我正在逐行解析一个.txt文件,并考虑一个目标标记。我使用一个正则表达式处理器引擎 我将每一行与:Java 使用输入文本构造的正则表达式中的模式语法异常,java,regex,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])"+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].*|$)
如何解决这个问题?您应该确保对用于生成正则表达式模式的任何纯文本字符串中的特殊字符进行转义。将
”(“
替换为”\(“
”),同样地,对于裸反斜杠(在任何其他步骤之前)、句点和所有其他特殊字符,至少替换您希望在输入中看到的所有字符。(如果是用户的任意输入,则假定每个字符都包含在内。)您的令牌中有特殊字符
看看:
公共静态字符串引号(字符串s)
返回指定字符串的文本模式字符串
此方法生成一个字符串,该字符串可用于创建与字符串匹配的模式,就像它是文字模式一样
输入序列中的元字符或转义序列没有特殊意义
这将为您带来好处:
String pattern = "(^|.*[\\s])" + Pattern.quote(token) + "([\\s].*|$)";
不需要自己做字符串魔术!:-)你永远不会关闭
中的(
在6-7(3-7
中)。你可能想逃避它:6-7\\\(3-7
我认为在不替换完整字符列表的情况下建议此解决方案不是一个好主意。无论如何,公认的答案是可行的。