阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

搜索和替换

28次阅读
没有评论

共计 1892 个字符,预计需要花费 5 分钟才能阅读完成。

分割字符串

使用正则表达式分割字符串可以实现更加灵活的功能。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"}

如果我们想让用户输入一组标签,然后把标签提取出来,因为用户的输入往往是不规范的,这时,使用合适的正则表达式,就可以消除多个空格、混合 ,;这些不规范的输入,直接提取出规范的字符串。

搜索字符串

使用正则表达式还可以搜索字符串,我们来看例子:

import java.util.regex.*;

public class Main {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);
        }
    }
}

我们获取到 Matcher 对象后,不需要调用 matches() 方法(因为匹配整个串肯定返回 false),而是反复调用 find() 方法,在整个串中搜索能匹配上 \\wo\\w 规则的子串,并打印出来。这种方式比 String.indexOf() 要灵活得多,因为我们搜索的规则是 3 个字符:中间必须是o,前后两个必须是字符[A-Za-z0-9_]

替换字符串

使用正则表达式替换字符串可以直接调用String.replaceAll(),它的第一个参数是正则表达式,第二个参数是待替换的字符串。我们还是来看例子:

// regex
public class Main {public static void main(String[] args) {String s = "The     quick\t\t brown   fox  jumps   over the  lazy dog.";
        String r = s.replaceAll("\\s+", " ");
        System.out.println(r); // "The quick brown fox jumps over the lazy dog."
    }
}

上面的代码把不规范的连续空格分隔的句子变成了规范的句子。可见,灵活使用正则表达式可以大大降低代码量。

反向引用

如果我们要把搜索到的指定字符串按规则替换,比如前后各加一个 <b>xxxx</b>,这个时候,使用replaceAll() 的时候,我们传入的第二个参数可以使用 $1$2 来反向引用匹配到的子串。例如:

// regex
public class Main {public static void main(String[] args) {String s = "the quick brown fox jumps over the lazy dog.";
        String r = s.replaceAll("\\s([a-z]{4})\\s", "<b>$1</b>");
        System.out.println(r);
    }
}

上述代码的运行结果是:

the quick brown fox jumps <b>over</b> the <b>lazy</b> dog.

它实际上把任何 4 字符单词的前后用 <b>xxxx</b> 括起来。实现替换的关键就在于 "<b>$1</b>",它用匹配的分组子串([a-z]{4}) 替换了$1

练习

模板引擎是指,定义一个字符串作为模板:

Hello, ${name}! You are learning ${lang}!

其中,以 ${key} 表示的是变量,也就是将要被替换的内容。

当传入一个 Map<String, String> 给模板后,需要把对应的 key 替换为 Map 的 value。

例如,传入 Map 为:

{
    "name": "Bob",
    "lang": "Java"
}

然后,${name}被替换为 Map 对应的值 Bob${lang} 被替换为 Map 对应的值Java,最终输出的结果为:

Hello, Bob! You are learning Java!

请编写一个简单的模板引擎,利用正则表达式实现这个功能。

提示:参考 Matcher.appendReplacement()方法。

下载练习

小结

使用正则表达式可以:

  • 分割字符串:String.split()
  • 搜索子串:Matcher.find()
  • 替换字符串:String.replaceAll()

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1892字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中