您可以使用
.replaceAll("\\B\"\\b(.*?)\\b\"\\B", "\\\\q{$1}")
或者,如果匹配可能跨越多行,请添加(?s)
修饰符:
.replaceAll("(?s)\\B\"\\b(.*?)\\b\"\\B", "\\\\q{$1}")
See the 正则表达式演示 https://regex101.com/r/EclEVb/1 .
Details
-
\B"\b
- a "
它位于字符串的开头或前面有一个非单词字符,后面有一个单词字符
-
(.*?)
- 第 1 组:除了换行符之外的任何零个或多个字符,尽可能少
-
\b"\B
- a "
that 位于字符串末尾或后跟非单词字符,并且前面带有单词字符。
替换是反斜杠 ("\\\\"
,请注意,在正则表达式替换部分中需要使用双文字反斜杠来插入真正的文字反斜杠,因为反斜杠是替换模式中的特殊字符),q{
,组 1 值($1
) and a }
.
See the Java演示 https://ideone.com/Drvxse:
String s = "This is my \"te\n\nst\" case\nwith lines for \"tes\"t\"ing\" with regex\nBut as he said \"It could be an arbitrary number of words\"";
System.out.println(s.replaceAll("\\B\"\\b(.*?)\\b\"\\B", "\\\\q{$1}"));
Output:
This is my "te
st" case
with lines for \q{tes"t"ing} with regex
But as he said \q{It could be an arbitrary number of words}
NOTE:
如果还需要匹配前面和后面都没有单词字符的两个连续双引号,可以按以下方式修改上面的正则表达式:
.replaceAll("(?s)\\B(\"\\b(.*?)\\b\"|\"\")\\B", "\\\\q{$2}")
See the 正则表达式演示 https://regex101.com/r/EclEVb/2.
Details
-
(?s)
- 嵌入标志选项(等于Pattern.DOTALL
)这使得.
也匹配换行符
-
\B
- 非单词边界,在这里,意味着紧邻左侧,必须有一个非单词字符或字符串开头(因为之后\B
,有一个非单词字符,"
)
-
(
- start of the first capturing group:
-
"\b(.*?)\b"
- "
后面跟着一个单词字符,然后第 2 组捕获任何零个或多个字符(尽可能少),然后是"
前面有一个单词 char (这就是为什么这个模式不能匹配""
,因为在第一个之后和第二个之前,必须有一个字母、数字或_
)
-
|
- or
-
""
- a ""
子串
-
)
- 第一个捕获组结束
-
\B
- 非单词边界,在这里,它意味着紧邻右侧,必须有一个非单词字符或字符串结尾(因为之前\B
,有一个非单词字符,"
).