java正则替换字符串的高级应用,正则分组
正则表达式的强大不再多少,基础语法可以参考网上其他文章,本文仅介绍java中利用正则对字符串进行替换。
需求场景:需将字符串“title:大学生#END# AND text:北京#END# AND domain:sina.com” 中,title或者text后面的字符串做处理,并去掉后面的,
既然是要进行处理,处理后的结果如“title:大学生 学生 AND text:北京市 北京 市 AND domain:sina.com”那必然要想办法进行提取,String的replace方法显然已经无法满足,但正则的分组匹配完全可以解决。
- Markdown和扩展Markdown简洁的语法
代码块
代码块语法遵循标准markdown代码,例如:
/**
* 将queryStr中的关键词提取并做分词处理
* @param queryStr
* @return
*/
public static String surroundQueryStrProcess(String queryStr) {
if (StringUtils.isEmpty(queryStr)) {
return queryStr;
}
Pattern p = Pattern.compile("(title:|text:)([^#]*)#END#");
Matcher matcher = p.matcher(queryStr);
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {//从开始进行匹配直到结束
matcher.appendReplacement(sbr, matcher.group(1)+QueryUtil.surroundParse(matcher.group(2)));//将匹配到的内容进行替换后追加到sbr,其中的QueryUtil.surroundParse是分词方法,即将matcher.group(2)的内容进行分词处理,在此不必过于纠结。
}
matcher.appendTail(sbr);//将匹配结束后,后续的内容一次性追加到sbr中
return sbr.toString();
}
/**
* 重点介绍一下正则表达式 "(title:|text:)([^#]*)#END#",
* 该表达式包含了两个分组(分组是用小括号来区别)即(title:|text:),([^#]*)
* 第一分组表示匹配字符串中的"title:"或者"text:",
* 第二个分组表示不以"#开头",用来匹配中间要处理的内容,
* 第二个分组后面的"#END#",没有进行分组,直接匹配
* 整个正则表达式会分别匹配到"title:大学生#END#"和"text:北京#END#",而正则中
* 用分组的好处时,对匹配到的表达式可以再进行细分,对细分内容进行进一步的处理。
*
* 总结:通过分组更灵活的对字符串进行替换操作
*/