平时我们总会遇到一些需求需要处理某些固定格式的代码片段来达到我们的要求,下面我们就来使用Java正则表达式替换我们需要的代码。首先来看一下替换前的页面长啥样
image地址中能看到有许多我们不需要的广告信息。 这个时候要改变其中指定的标签或者是改变标签中指定的属性。
1、如何获取这段html代码中的所有img标签中的图片地址做一些相关的操作
/**
* 得到网页中图片的地址
*/
public static Set<String> getImgStr(String htmlStr) {
Set<String> pics = new HashSet<>();
String img = "";
Pattern p_image;
Matcher m_image;
//分解正则表达式
// <img 匹配字符串为 <img 的
// .* 匹配任意长度的除/r /n 以外的字符,* 是不限次数
// src 匹配字符串为 src 的
// \\s* 匹配任意长度任意不可见字符,包括空格、制表符、换页符等等
// = 匹配等号字符
// \\s* 匹配任意长度任意不可见字符,包括空格、制表符、换页符等等
// (.*?) 匹配任意长度的除/r /n 以外的任意字符 0次或一次
// [^>]*? 匹配不为>的不限次数 0次或1次
String regEx_img = "<img.*src\\s*=\\s*(.*?)[^>]*?>";
//Pattern.CASE_INSENSITIVE 参数含义为忽略大小写匹配,会稍微损失一点性能
// 把这个正则的字符串编译为Pattern对象
p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);
//调用Pattern对象的matcher方法返回一个Matcher对象
m_image = p_image.matcher(htmlStr);
while (m_image.find()) {
// 得到<img />数据
img = m_image.group();
// 匹配<img>中的src数据
Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img);
while (m.find()) {
pics.add(m.group(1));
}
}
return pics;
}
2、如何获取html代码中的指定的标签中的内容 ,获取标签为article包裹的所有内容
/**
* 获取html代码中的指定标签
*/
public static String getArticleStr1(String htmlStr) {
String img = "";
Pattern p_image;
Matcher m_image;
String regEx_img = "<article.*\\s*</article>";
p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);
m_image = p_image.matcher(htmlStr);
while (m_image.find()) {
// 得到<img />数据
img = m_image.group();
}
return img;
}
3、如何替换html代码中的指定标签中的内容,比如将网页中的html代码中的img标签添加一些属性样式 ,src属性不改变
/**
* 替换指定标签的指定属性
* @param str html代码
* @param beforeTag 标签名
* @param tagAttrib 属性名
* @param startTag 替换为 开始标签
* @param endTag 替换为结束标签
* @return
*/
public static String replaceHtmlTag(String str, String beforeTag, String tagAttrib, String startTag, String endTag) {
String regxpForTag = "<\\s*" + beforeTag + "\\s+([^>]*)\\/>"; //需要替换的标签正则匹配
Pattern patternForTag = Pattern.compile(regxpForTag); //编译表达式
Matcher matcherForTag = patternForTag.matcher(str);
StringBuffer sb = new StringBuffer();
boolean result = matcherForTag.find();
while (result) {
String img = "";
Matcher matcherForAttrib1 = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(matcherForTag.group(1)); //获取指定标签中的指定属性
if (matcherForAttrib1.find()) {
img = startTag + matcherForAttrib1.group(1) + endTag; //拼接需要替换的标签
}
matcherForTag.appendReplacement(sb, img);
result = matcherForTag.find();
}
matcherForTag.appendTail(sb); //最后将所有标签拼接到一起返回
return sb.toString();
}
调用代码如下:
//替换img标签属性
replaceHtmlTag( "html字符串" , "img", "src", "<img width='100%' height='100%' class='img-responsive' src=''" , "/>");
通过上面这些操作后,基本上能获取到想要的代码部分。Java正则表达式还可以做一些验证的操作,比如说验证手机号,验证邮箱等等。
java中关于正则的类在java.util.regex包中,该包中有3个类和一个接口,分别用处如下:
*MatchResult*
:定义一些Matcher中的接口的一些查询方法,用于确定正则表达式的匹配结果
Matcher
:代表一组Pattern对象下的匹配结果
Pattern
:代表一种指定的正则表达式,核心静态方法 compile(“正则表达式”) 用于编译给定的正则表达式
PatternSyntaxException
:未通过检查的抛出异常
如果文章的内容对你有帮助,欢迎关注公众号:优享JAVA(ID:YouXiangJAVA)
,那里有更多的技术干货,并精心准备了一份程序员书单。期待你的到来!
网友评论