无法转义 Java 中的右括号?
Can't escape a closing parenthesis in Java?
我有一个很长的正则表达式,似乎有问题,但只有从文本文件导入时才会出现问题。我已将其缩小到以下部分(此处显示为文字字符串):
"(?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}(?=\))
^
那么,为什么会这样?为什么在硬编码时转义右括号合法,但在从文本文件中读取时却不合法?
您正在编写 Java 字符串文字。 \)
不是 Java 字符串文字的合法转义码。
您需要使用 \
转义每个反斜杠,以便为正则表达式创建一个只有一个反斜杠的字符串。
only when imported from a text file
您必须将其打印到控制台。
如果它打印出 (?i)(?<!\w)\w{2,3}(?=\))
没问题,
如果它打印出双重转义,你必须取消转义那些
取消转义转义字符的一个好方法是执行全局 find/replace
(这是解析的 %90)
查找"(?x)\\ \\"
替换 "\\"
Un-escape non-escapes是一种相对的方法。
这取决于字符和替换,
或者两者都不采取行动。这主要是特定于语言的,
但你可以自己动手。为此,基本的是...
查找"(?xs)\\ (.)"
替换 roll your own"
我有一个很长的正则表达式,似乎有问题,但只有从文本文件导入时才会出现问题。我已将其缩小到以下部分(此处显示为文字字符串):
"(?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}(?=\))
^
那么,为什么会这样?为什么在硬编码时转义右括号合法,但在从文本文件中读取时却不合法?
您正在编写 Java 字符串文字。 \)
不是 Java 字符串文字的合法转义码。
您需要使用 \
转义每个反斜杠,以便为正则表达式创建一个只有一个反斜杠的字符串。
only when imported from a text file
您必须将其打印到控制台。
如果它打印出 (?i)(?<!\w)\w{2,3}(?=\))
没问题,
如果它打印出双重转义,你必须取消转义那些
取消转义转义字符的一个好方法是执行全局 find/replace
(这是解析的 %90)
查找"(?x)\\ \\"
替换 "\\"
Un-escape non-escapes是一种相对的方法。
这取决于字符和替换,
或者两者都不采取行动。这主要是特定于语言的,
但你可以自己动手。为此,基本的是...
查找"(?xs)\\ (.)"
替换 roll your own"