Java正则提取子串
正则表达式是一种强大的文本匹配工具,在Java中,使用正则表达式可以方便地实现对字符串的匹配和子串提取。基本步骤如下:
- 创建正则表达式模式:正则表达式模式是匹配文本的模板
- 编译正则表达式模式:将正则表达式模式编译成一个可执行的正则表达式对象
- 匹配文本:使用编译后的正则表达式对象对目标文本进行匹配
- 提取子串:根据匹配结果获取所需子串
以下是一个示例:
1) 创建正则表达式模式
String regex = "[0-9]+";
2) 编译正则表达式模式
Pattern pattern = Pattern.compile(regex);
3) 匹配文本
String text = "abc10de";
Matcher matcher = pattern.matcher(text);
4) 提取子串
if (matcher.find()) {
System.out.println(matcher.group());
}
上述代码首先检查匹配器是否找到匹配的字符串,然后使用group()
方法获取匹配到的子字符串
值得注意的是,group()
方法底层调用了group(0)
,即默认获取匹配到的第一个,如果想要获取第N个子串,可以使用如下方式:
// 正则提取字符串中的子串,可指定提取第n个
public static String getRegexStr(String str, String regex, Integer n){
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
List<String> list = new ArrayList<>();
// 除了以下写法,其它写法都不对
while (matcher.find()){
list.add(matcher.group());
}
System.out.println(list);
return list.get(n);
}
以下是一些使用示例:
// 正则提取示例1
String text = "abc10de178fg6";
System.out.println(getRegexStr(text, "[0-9]+", 0));
System.out.println(getRegexStr(text, "[0-9]+", 1));
// 正则提取示例2
String text1 = "abc(10)de(8,5)";
System.out.println(getRegexStr(text1, "\\([0-9,]*\\)", 0));
System.out.println(getRegexStr(text1, "\\([0-9,]*\\)", 1));
// 正则提取示例3
String text2 = "Today is 2024-11-16, tomorrow is 2024-11-17.";
System.out.println(getRegexStr(text2, "(\\d{4})-(\\d{2})-(\\d{2})", 0));
System.out.println(getRegexStr(text2, "(\\d{4})-(\\d{2})-(\\d{2})", 1));
另外,值得注意的是,除了上述写法外,其它写法都不对。例如:
// 错误写法1
System.out.println(matcher.group(n));
// 错误写法2
if (matcher.find()) {
System.out.println(matcher.group(n));
}
// 错误写法3
if (matcher.find(n)) {
System.out.println(matcher.group(n));
}
如果使用上述写法,程序将抛出IndexOutOfBoundsException异常: