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+,希望能匹配到。但是,这不起作用,因为它将如下所示:
- 编辑器内容:The\nright\n\ttasks。
- table句子:正确的任务。
- NewSentence:Thes+权利+任务。 // 在 'replaceAll' 动作之后
- 应该是:The\s+right\s+tasks.
所以,我的问题是:如何调整编译器的输入?
我对 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+");
(我的编程问题可能看起来有些曲折,但我没有其他解决方案。)
在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+,希望能匹配到。但是,这不起作用,因为它将如下所示:
- 编辑器内容:The\nright\n\ttasks。
- table句子:正确的任务。
- NewSentence:Thes+权利+任务。 // 在 'replaceAll' 动作之后
- 应该是:The\s+right\s+tasks.
所以,我的问题是:如何调整编译器的输入? 我对 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+");