0
点赞
收藏
分享

微信扫一扫

Java搜索与替换

分割字符串

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

 Run

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

替换字符串

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

// regex

 Run

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

反向引用

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

// regex

 Run

上述代码的运行结果是:

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()​​方法。

举报

相关推荐

0 条评论