Java 中的多行正则表达式

Multiline RegEx in Java

(我的编程问题可能看起来有些曲折,但我没有其他解决方案。)

在Eclipse的编辑器中写了一段文字。通过为 Eclipse 激活自制的 Table 视图插件,文本质量由接收编辑器文本的激活的 Python 脚本(不是我的 editable )自动检查。编辑器文本从 space 个字符(\n、\t)中删除,除了正常的 space(' '),否则句子无法进行 QA 检查。脚本完成后,它 return 将不正确的句子发送到 table。

可以单击 table 中的句子,插件将在活动编辑器中搜索(逐行)单击的句子。这适用于单行句子。但是,在活动编辑器中找不到多行语句,因为编译语句中的所有\n 和\t 都丢失了。

为了解决这个问题,我更改了脚本,将完整的编辑器文本作为一个字符串。我尝试了以下方法:

String newSentence = tableSentence.replaceAll(" ", "\s+")
Pattern p = Pattern.compile(newSentence)
Matcher contentMatcher = p.matcher(editorContent) // editorContent is a string
if (contentMatcher.find()) {
  // Get index offset of string and length of string
}

把所有的space都改成\s+,希望能匹配到。但是,这不起作用,因为它将如下所示:

所以,我的问题是:如何调整编译器的输入? 我对 Java 没有经验,所以我不知道如何更改它。不幸的是,我无法将 Python 脚本更改为也 return 完整的句子...

在您的正则表达式中添加第三个和第四个反斜杠,使其看起来像这样:\\s+.

Java 没有原始(或逐字)字符串,因此您必须转义反斜杠,因此在正则表达式引擎中它会将其视为双反斜杠。这应该可以解决添加 s+ 而不是空格的问题。

当您在代码中键入正则表达式时,它是这样的:

\\s+  
 |     # Compile time
 V  
\s+  
 |     # regex parsing 
 V
 \s+   # actual regex used

根据@nhahtdh 评论更新了我的答案(反斜杠的固定数量)

您需要使用 "\\s+" 而不是 "\s+",因为 \regex replacement string syntax 中的转义符。要在替换文本中指定文字 \,您需要在替换字符串中写入 \,并且加倍为 "\\",因为 \ 需要在 [=38 中转义=] 字符串文字。

请注意,\ 恰好在 Java 的正则表达式替换字符串语法中用作转义字符。其他语言,如JavaScript,使用$转义$,所以\不需要在JavaScript的正则表达式替换字符串中转义。

如果要用文字文本替换匹配项,可以使用 Matcher.quoteReplacement 来避免处理正则表达式替换字符串中的转义:

String newSentence = tableSentence.replaceAll(" ", Matcher.quoteReplacement("\s+"));

在这种情况下,由于您正在搜索字符串并将其替换为另一个字符串,因此您可以使用 String.replace 代替,它会进行正常的字符串替换:

String newSentence = tableSentence.replace(" ", "\s+");