Java和Groovy正则使用
- 2020 年 3 月 10 日
- 筆記
相信很多人都对正则有很深的交情,毕竟这玩意功能太强了,几乎无处不在。我最长用的正则还是爬虫。爬虫分两类,一种是接口返回json
数据的,一种是返回HTML
数据的。
对于第一种返回json
数据的可以直接用jsonobject
解析。而第二种往往用HTML
解析类做起来比较麻烦,特别是提取表单信息的时候,所以我直接当做string
信息,通过正则表达式提取想要的信息。
下面分享几个案例:
- 电子书网站爬虫实践
- groovy爬虫实例——历史上的今天
- 爬取720万条城市历史天气数据
- 记一次失败的爬虫
Java正则
里面用到了一个Java
的正则工具类,算是写了Java
的正则Demo
,代码如下:
package com.fun.utils; import com.fun.frame.SourceCode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 正则验证的封装 */ public class Regex extends SourceCode { private static Logger logger = LoggerFactory.getLogger(Regex.class); /** * 正则校验文本是否匹配 * * @param text 需要匹配的文本 * @param regex 正则表达式 * @return */ public static boolean isRegex(String text, String regex) { return Pattern.compile(regex).matcher(text).find(); } /** * 正则校验文本是否完全匹配,不包含其他杂项,相当于加上了^和$ * * @param text 需要匹配的文本 * @param regex 正则表达式 * @return */ public static boolean isMatch(String text, String regex) { return Pattern.compile(regex).matcher(text).matches(); } /** * 返回所有匹配项 * * @param text 需要匹配的文本 * @param regex 正则表达式 * @return */ public static List<String> regexAll(String text, String regex) { List<String> result = new ArrayList<>(); Matcher matcher = Pattern.compile(regex).matcher(text); while (matcher.find()) { result.add(matcher.group()); } return result; } /** * 获取匹配项,不包含文字信息,会删除regex的内容 * <p>不保证完全正确</p> * * @param text * @param regex * @return */ public static String getRegex(String text, String regex) { String result = EMPTY; try { result = regexAll(text, regex).get(0); String[] split = regex.split("(\.|\+|\*|\?)"); for (int i = 0; i < split.length; i++) { String s1 = split[i]; if (!s1.isEmpty()) result = result.replaceAll(s1, EMPTY); } } catch (Exception e) { logger.warn("获取匹配对象失败!", e); } finally { return result; } } }
Groovy正则
首先来讲,Groovy
完全可以使用Java的正则语法,上面的正则工具类完全适用于Groovy
脚本,我的爬虫Demo里面基本上也都是在Groovy
脚本里面直接使用的这个工具类。
下面分享一下Groovy
语言自己的正则表达式。其中最重要的三个符号=~
相当于Java
里面的Pattern.compile(regex).matcher(text)
,然后==~
相当于Pattern.compile(regex).matcher(text).match()
,这里不是find()
,两者区别请自行搜索,还有一个写法def stra = /.*testw+/
,专指正则表达式,使用收尾都加上/
而不是"
。
下面是我的Demo:
public static void main(String[] args) { def str = "fantester" def matcher = str =~ "\wt" println matcher.find() println matcher[0] println matcher.size() matcher.each {println it} def b = str ==~ ".*er" output b def stra = /.*testw+/ println str ==~ stra ("fanfanfanfan" =~ "\wf").each {println it} "fanfanfanfan".eachMatch(/wa/) {println it} }
控制台输出如下:
INFO-> 当前用户:fv,IP:192.168.0.100,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.3 true nt 2 nt st INFO-> true true nf nf nf fa fa fa fa Process finished with exit code 0
Groovy
语法还是有很强的可玩性的,虽然基本兼容Java
语法,但是深入了解Groovy
之后,是可以写出不逊于Python
的简洁语法。
- 郑重声明:文章首发于公众号“FunTester”,禁止第三方(腾讯云除外)转载、发表。