搜索和替换
538字约2分钟
2024-08-10
分割字符串
使用正则表达式分割字符串可以实现更加灵活的功能。String.split()
方法传入的正是正则表达式。我们来看下面的代码
"a b c".split("\\s"); // { "a", "b", "c" }
"a b c".split("\\s"); // { "a", "b", "", "c" }
"a, b ;; c".split("[\\,\\;\\s]+"); // { "a", "b", "c" }
如果我们想让用户输入一组标签,然后把标签提取出来,因为用户的输入往往是不规范的,这时,使用合适的正则表达式,就可以消除多个空格、混合 ,
和 ;
这些不规范的输入,直接提取出规范的字符串
搜索字符串
使用正则表达式还可以搜索字符串,我们来看例子
public static void main(String[] args) {
String s = "the quick brown fox jumps over the lazy dog.";
Pattern p = Pattern.compile("\\wo\\w");
Matcher m = p.matcher(s);
while (m.find()) {
String sub = s.substring(m.start(), m.end());
System.out.println(sub);
}
// row
// fox
// dog
}
我们获取到 Matcher
对象后,不需要调用 matches()
方法(因为匹配整个串肯定返回 false
),而是反复调用 find()
方法,在整个串中搜索能匹配上 \\wo\\w
规则的子串,并打印出来。这种方式比 String.indexOf()
要灵活得多,因为我们搜索的规则是 3
个字符:中间必须是 o
,前后两个必须是字符 [A-Za-z0-9_]
替换字符串
使用正则表达式替换字符串可以直接调用 String.replaceAll()
,它的第一个参数是正则表达式,第二个参数是待替换的字符串
public static void main(String[] args) {
String s = "Talk is\t\t cheap. Show me the code.";
String r = s.replaceAll("\\s+", " ");
System.out.println(r); // Talk is cheap. Show me the code.
}
反向引用
如果我们要把搜索到的指定字符串按规则替换,比如前后各加一个 <b>xxxx</b>
,这个时候,使用 replaceAll()
的时候,我们传入的第二个参数可以使用 $1
、$2
来反向引用匹配到的子串
public static void main(String[] args) {
String s = "Talk is cheap.Show me the code ";
String r = s.replaceAll("\\s([a-z]{4})\\s", " <b>$1</b> ");
System.out.println(r); // Talk is cheap. Show me the <b>code</b>
}