Java中的多行正则表达式

Java中的多行正则表达式,java,python,regex,eclipse-plugin,Java,Python,Regex,Eclipse Plugin,(我的编程问题似乎有些离谱,但我看不到其他解决方案。) 文本是在Eclipse的编辑器中编写的。通过为Eclipse激活自制的表视图插件,文本质量由接收编辑器文本的激活Python脚本(我不可编辑)自动检查。编辑器文本从空格字符(\n,\t)中删除,正常空格(“”)除外,因为否则无法对句子进行QA检查。脚本完成后,会将不正确的句子返回到表中 可以单击表中的句子,插件将在活动编辑器中搜索(每行一行)已单击的句子。这适用于单行句子。但是,在活动编辑器中找不到多行句子,因为编译的句子中缺少所有的\n和

(我的编程问题似乎有些离谱,但我看不到其他解决方案。)

文本是在Eclipse的编辑器中编写的。通过为Eclipse激活自制的表视图插件,文本质量由接收编辑器文本的激活Python脚本(我不可编辑)自动检查。编辑器文本从空格字符(\n,\t)中删除,正常空格(“”)除外,因为否则无法对句子进行QA检查。脚本完成后,会将不正确的句子返回到表中

可以单击表中的句子,插件将在活动编辑器中搜索(每行一行)已单击的句子。这适用于单行句子。但是,在活动编辑器中找不到多行句子,因为编译的句子中缺少所有的\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
}
通过将所有空格改为\s+,我希望能够获得匹配。但是,这不起作用,因为它将如下所示:

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
}
  • editorContent:右侧\n\t任务
  • TableEntence:正确的任务
  • 新闻事件:Thes+权限+任务。//“replaceAll”操作之后
  • 应该是\s+右侧\s+任务
所以,我的问题是:如何调整编译器的输入?
我对Java缺乏经验,所以我不知道如何改变这一点。。不幸的是,我无法更改Python脚本以同时返回完整的句子…

在正则表达式中添加第三个和第四个反斜杠,因此看起来是这样的:
\\\\s+

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

在代码中键入正则表达式时,如下所示:

\\\\s+  
 |     # Compile time
 V  
\\s+  
 |     # regex parsing 
 V
 \s+   # actual regex used
根据@nhahtdh comment更新了我的答案(固定反斜杠数)

您需要使用
“\\\\s+”
而不是
“\\s+”
,因为
\
是。要在替换文本中指定一个文本
\
,需要在替换字符串中写入
\
,因为
\
需要在Java字符串文本中转义,所以该字符串最多可加倍为
“\\\\\\”

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

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

String newSentence = tableSentence.replaceAll(" ", Matcher.quoteReplacement("\\s+"));
在这种情况下,由于您正在搜索字符串并将其替换为另一个字符串,因此可以改用,它执行正常的字符串替换:

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

您需要
“\\\\s+”
,因为
\
也是替换字符串中的转义字符。您可能希望使用
Matcher.quoteReplacement(\\s+”)
来避免在替换包含
\
的文本时出现双转义。实际上,在这种情况下,只需使用
replace
函数,因为它需要的是字符串,而不是正则表达式。
\
是替换字符串的一部分,而不是正则表达式语法<代码>\恰好用于转义正则表达式和替换字符串。其他语言(如JavaScript)可能使用
$
来转义
$
,从而避免了在替换字符串中使用
\
作为转义字符。感谢您的回答和清晰的处理顺序!现在我对Java中的转义字符有了更好的理解。谢谢你的通知!我错误地认为replace只替换了第一个事件(考虑到还有一个“replaceAll”)。我应该早点看的。