我有一个很长的正则表达式似乎有问题,但只有从文本文件导入时才会出现问题。我已将其缩小到以下部分(此处显示为文字字符串):
"(?i)(?<!\\w)\\w{2,3}(?=\\))"
正如你所看到的,接近结束时,我正试图逃避一个前瞻性的右括号。现在,如果这是硬编码的,例如:
Pattern myPattern = Pattern.compile("(?i)(?<!\\w)\\w{2,3}(?=\\))");
完全符合预期。但是,如果我从文本文件中读取它,例如:
File patternFile = new File("patterns.txt");
List<String> patternText = FileUtils.readLines(patternFile);
String ucText = patternText.get(0).trim();
Pattern myPattern = Pattern.compile(ucText);
然后我收到错误消息:
Exception in thread "Thread-4" java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 25
(?i)(?<!\\w)\\w{2,3}(?=\\))
^
那么,为什么会这样呢?为什么在硬编码时转义右括号是合法的,而在从文本文件中读取时却不合法?
答案 0 :(得分:4)
您正在编写Java字符串文字。 \)
不是Java字符串文字的合法转义码。
您需要使用\\
转义每个反斜杠,以创建一个带正则表达式的单个反斜杠的字符串。
答案 1 :(得分:0)
only when imported from a text file
您必须将其打印到控制台
如果打印出(?i)(?<!\w)\w{2,3}(?=\))
则确定,确定
如果它打印出来,双重逃脱,你必须取消那些
解除转义字符的好方法是进行全局查找/替换 (这是解析的%90)
查找"(?x)\\\\ \\\\"
替换"\\\\"
逃避非逃避是一种相对的方法
这取决于性格和替代,
或两者都没有任何行动。这主要是语言特定的,
但你可以自己动手。为此,基本的是......
查找"(?xs)\\\\ (.)"
替换roll your own"