在 Java 中使用正则表达式获取单数或复数字符串
Get singular or Plural string with regex in Java
我想根据数字将字符串中的变量替换为 singular/plural 单词。
我试过使用正则表达式,但我不知道如何结合使用正则表达式和替换。
//INPUTS: count = 2; variable = "Some text with 2 %SINGMULTI:number:numbers%!"
public static String singmultiVAR(int count, String input) {
if (!input.contains("SINGMULTI")) {
return null;
}
Matcher m = Pattern.compile("\%(.*?)\%", Pattern.CASE_INSENSITIVE).matcher(input);
if (!m.find()) {
throw new IllegalArgumentException("Invalid input!");
}
String varia = m.group(1);
String[] varsplitted = varia.split(":");
return count == 1 ? varsplitted[1] : varsplitted[2];
}
//OUTPUTS: The input but then with the SINGMULTI variable replaced.
它现在只输出变量,而不是整个输入。我需要如何将其添加到代码中?
您可以使用Matche
的replaceAll
方法来替换匹配的字符串。
实际上,您不必拆分字符串,只需匹配正则表达式中的 :
:
// You don't need the "if (!input.contains("SINGMULTI"))" check either!
Matcher m = Pattern.compile("\%SINGMULTI:(.*?):(.*?)\%").matcher(input);
如果计数为1,则替换为第1组,否则替换为第2组:
// after checking m.find()
return m.replaceAll(count == 1 ? "" : "");
使用正则表达式替换循环。
仅供参考: 您还需要替换输入字符串中的数字,因此我使用 %COUNT%
作为标记。
另请注意,%
不是正则表达式中的特殊字符,因此无需对其进行转义。
可以轻松扩展此逻辑以支持更多替换标记。
public static String singmultiVAR(int count, String input) {
StringBuilder buf = new StringBuilder(); // Use StringBuffer in Java <= 8
Matcher m = Pattern.compile("%(?:(COUNT)|SINGMULTI:([^:%]+):([^:%]+))%").matcher(input);
while (m.find()) {
if (m.start(1) != -1) { // found %COUNT%
m.appendReplacement(buf, Integer.toString(count));
} else { // found %SINGMULTI:x:y%
m.appendReplacement(buf, (count == 1 ? m.group(2) : m.group(3)));
}
}
return m.appendTail(buf).toString();
}
测试
for (int count = 0; count < 4; count++)
System.out.println(singmultiVAR(count, "Some text with %COUNT% %SINGMULTI:number:numbers%!"));
输出
Some text with 0 numbers!
Some text with 1 number!
Some text with 2 numbers!
Some text with 3 numbers!
我想根据数字将字符串中的变量替换为 singular/plural 单词。
我试过使用正则表达式,但我不知道如何结合使用正则表达式和替换。
//INPUTS: count = 2; variable = "Some text with 2 %SINGMULTI:number:numbers%!"
public static String singmultiVAR(int count, String input) {
if (!input.contains("SINGMULTI")) {
return null;
}
Matcher m = Pattern.compile("\%(.*?)\%", Pattern.CASE_INSENSITIVE).matcher(input);
if (!m.find()) {
throw new IllegalArgumentException("Invalid input!");
}
String varia = m.group(1);
String[] varsplitted = varia.split(":");
return count == 1 ? varsplitted[1] : varsplitted[2];
}
//OUTPUTS: The input but then with the SINGMULTI variable replaced.
它现在只输出变量,而不是整个输入。我需要如何将其添加到代码中?
您可以使用Matche
的replaceAll
方法来替换匹配的字符串。
实际上,您不必拆分字符串,只需匹配正则表达式中的 :
:
// You don't need the "if (!input.contains("SINGMULTI"))" check either!
Matcher m = Pattern.compile("\%SINGMULTI:(.*?):(.*?)\%").matcher(input);
如果计数为1,则替换为第1组,否则替换为第2组:
// after checking m.find()
return m.replaceAll(count == 1 ? "" : "");
使用正则表达式替换循环。
仅供参考: 您还需要替换输入字符串中的数字,因此我使用 %COUNT%
作为标记。
另请注意,%
不是正则表达式中的特殊字符,因此无需对其进行转义。
可以轻松扩展此逻辑以支持更多替换标记。
public static String singmultiVAR(int count, String input) {
StringBuilder buf = new StringBuilder(); // Use StringBuffer in Java <= 8
Matcher m = Pattern.compile("%(?:(COUNT)|SINGMULTI:([^:%]+):([^:%]+))%").matcher(input);
while (m.find()) {
if (m.start(1) != -1) { // found %COUNT%
m.appendReplacement(buf, Integer.toString(count));
} else { // found %SINGMULTI:x:y%
m.appendReplacement(buf, (count == 1 ? m.group(2) : m.group(3)));
}
}
return m.appendTail(buf).toString();
}
测试
for (int count = 0; count < 4; count++)
System.out.println(singmultiVAR(count, "Some text with %COUNT% %SINGMULTI:number:numbers%!"));
输出
Some text with 0 numbers!
Some text with 1 number!
Some text with 2 numbers!
Some text with 3 numbers!