我想替换字符串中的一对引号。换句话说,必须有一个问号事件计数。
第一个替换为„
,第二个替换为”
。
简单输入:Some "text"
输出:Some „text”
我写了一个简单的代码来处理(下面),但我想知道是否有一个更简单的方法,例如使用regex。我的简单正则表达式。*(").+(?=("))找到一对引号,但它不检查问号的总数是否为偶数。是否有一种方法来实现我想要使用正则表达式?
My Java code:
private static String replace(String s) {
if (s.isEmpty()) {
return s;
}
long count = s.chars()
.filter(c -> c == '"')
.count();
if (count % 2 != 0) {
return s;
}
final StringBuilder sb = new StringBuilder(s.length());
boolean replaceFirst = true;
for (int i = 0; i < s.length(); i++) {
final char c = s.charAt(i);
if (c != '"') {
sb.append(c);
} else {
sb.append(
replaceFirst ? "„" : "”"
);
if (replaceFirst) {
replaceFirst = false;
}
}
}
return sb.toString();
}
要将直双引号转换为大双引号,可以使用正则表达式匹配一对直引号,同时捕获中间除直双引号以外的任何字符,并将其替换为对大双引号内捕获值的反向引用:
.replaceAll(""([^"]*)"", "„$1”")
参见regex演示。<<em>细节/em>
"
- a"
char([^"]*)
-捕获组1(替换模式中的$1
指该组值):"
以外的任何零个或多个(*
)字符([^"]
是一个否定的字符类)"
- a"
char.
查看Java演示:
String s = "Some "text"";
System.out.println(s.replaceAll(""([^"]*)"", "„$1”"));
// => Some „text”