我需要替换字符串中的所有下划线,除了那些落在两个撇号范围内的下划线。例如:
"first_name" => "first name"
"code_numbers = '123_456'" => "code numbers = '123_456'"
我目前只是使用 .replaceAll("_", " ") 丢弃所有下划线,因为它们不是很常见,但我现在想触及所有的碱基以防万一。
这应该有效(此正则表达式替换所有 _ 后跟偶数个单引号)。当然,这需要你的报价平衡:
String str = "\"code_numbers = '123_456'\"";
str = str.replaceAll("(?x) " +
"_ " + // Replace _
"(?= " + // Followed by
" (?: " + // Start a non-capture group
" [^']* " + // 0 or more non-single quote characters
" ' " + // 1 single quote
" [^']* " + // 0 or more non-single quote characters
" ' " + // 1 single quote
" )* " + // 0 or more repetition of non-capture group (multiple of 2 quotes will be even)
" [^']* " + // Finally 0 or more non-single quotes
" $ " + // Till the end (This is necessary, else every _ will satisfy the condition)
") " , // End look-ahead
""); // Replace with ""
复活这个问题,因为它有一个没有提到的简单正则表达式解决方案。(在对正则表达式赏金任务进行一些研究时发现了您的问题。)
'[^']*'|(_)
左边的交替匹配完成'single quoted strings'
。我们将忽略这些匹配。右侧匹配并捕获组 1 的下划线,我们知道它们是正确的下划线,因为它们与左侧的表达式不匹配。
这是工作代码(参见在线演示):
import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;
class Program {
public static void main (String[] args) throws java.lang.Exception {
String subject = "code_numbers = '123_456'";
Pattern regex = Pattern.compile("'[^']*'|(_)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
if(m.group(1) != null) m.appendReplacement(b, " ");
else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
System.out.println(replaced);
} // end main
} // end Program
参考