搜索和替换

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

搜索字符串

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

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

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

搜索和替换 - 图1

反向引用

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

上述代码的运行结果是:

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

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

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

例如,传入Map为:

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

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

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

下载练习: (推荐使用IDE练习插件快速下载)

小结

使用正则表达式可以:

  • 分割字符串:String.split()
  • 替换字符串:String.replaceAll()