无法逃脱Java中的右括号?

时间:2015-05-27 20:52:39

标签: java regex escaping

我有一个很长的正则表达式似乎有问题,但只有从文本文件导入时才会出现问题。我已将其缩小到以下部分(此处显示为文字字符串):

"(?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}(?=\\))
                         ^

那么,为什么会这样呢?为什么在硬编码时转义右括号是合法的,而在从文本文件中读取时却不合法?

2 个答案:

答案 0 :(得分:4)

您正在编写Java字符串文字。 \)不是Java字符串文字的合法转义码。

您需要使用\\转义每个反斜杠,以创建一个带正则表达式的单个反斜杠的字符串。

答案 1 :(得分:0)

only when imported from a text file

您必须将其打印到控制台 如果打印出(?i)(?<!\w)\w{2,3}(?=\))则确定,确定 如果它打印出来,双重逃脱,你必须取消那些

解除转义字符的好方法是进行全局查找/替换 (这是解析的%90)

查找"(?x)\\\\ \\\\"
替换"\\\\"

逃避非逃避是一种相对的方法 这取决于性格和替代,
或两者都没有任何行动。这主要是语言特定的,
但你可以自己动手。为此,基本的是......

查找"(?xs)\\\\ (.)"
替换roll your own"