实现功能从“第十八届人民代表大会第二次会议”中识别出18和2用来查询届次
失败案例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractNumbers {
public static void main(String[] args) {
ArrayList<String> jcList = new ArrayList<>();
String str = "嵊泗县第十八届人民代表大会第二次会议";
Pattern pattern = Pattern.compile("\\d+"); // 正则表达式,匹配一个或多个数字
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group()); // 输出匹配到的数字
jcList.add(matcher.group());
}
if(jcList.size()>0){ //业务需求 根据会议和届次查询
query.setRdhj(jcList.get(0));
query.setRdhc(jcList.get(1));
}
}
}
在Java的Matcher
类中,group(0)
方法返回的是整个匹配项,而不论是否使用了括号来创建捕获组。如果没有定义捕获组,那么group(1)
将会抛出IndexOutOfBoundsException
异常
成功案例(有瑕疵):
import java.util.HashMap; import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChineseNumberExtractor {
private static final Map<String, Integer> chineseToArabicMap = new HashMap<>();
static { chineseToArabicMap.put("零", 0); chineseToArabicMap.put("一", 1); chineseToArabicMap.put("二", 2); chineseToArabicMap.put("三", 3); chineseToArabicMap.put("四", 4); chineseToArabicMap.put("五", 5); chineseToArabicMap.put("六", 6); chineseToArabicMap.put("七", 7); chineseToArabicMap.put("八", 8); chineseToArabicMap.put("九", 9); chineseToArabicMap.put("十", 10); }
public static void main(String[] args) {
String input = "第十八届人民代表大会第二次会议";
Pattern pattern = Pattern.compile("([零一二三四五六七八九十]+十?)"); // 匹配中文数字,包括可能存在的"十"
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String chineseNumber = matcher.group();
int arabicNumber = convertChineseToArabic(chineseNumber);
System.out.println("识别到的中文数字: " + chineseNumber + ",转换为阿拉伯数字: " + arabicNumber);
}
}
private static int convertChineseToArabic(String chineseNumber) {
int number = 0;
int multiplier = 1;
for (int i = chineseNumber.length() - 1; i >= 0; i--) {
char c = chineseNumber.charAt(i);
number += chineseToArabicMap.get(String.valueOf(c)) * multiplier;
multiplier = 1; // 重置multiplier为1,因为已经处理了一个数字
}
return number;
}
}
这个方法有瑕疵 比如 二十四 会转换成16 修改后:
private static int convertChineseToArabic(String chineseNumber) {
int number = 0;
int multiplier = 1;
for (int i = chineseNumber.length() - 1; i >= 0; i--) {
char c = chineseNumber.charAt(i);
if (c == '十') {
multiplier = 10;
if (i==0){
number += multiplier;
}
} else {
number += chineseToArabicMap.get(String.valueOf(c)) * multiplier;
multiplier = 1; // 重置multiplier为1,因为已经处理了一个数字
}
}
return number;
}