相信很多人都对正则有很深的交情,毕竟这玩意功能太强了,几乎无处不在。我最长用的正则还是爬虫。爬虫分两类,一种是接口返回​​json​​​数据的,一种是返回​​HTML​​数据的。

对于第一种返回​​json​​​数据的可以直接用​​jsonobject​​​解析。而第二种往往用​​HTML​​​解析类做起来比较麻烦,特别是提取表单信息的时候,所以我直接当做​​string​​信息,通过正则表达式提取想要的信息。

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 = /.*test\w+/​​​,专指正则表达式,使用收尾都加上​​/​​​而不是​​"​​。

下面是我的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 = /.*test\w+/

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​​的简洁语法。