前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java和Groovy正则使用

Java和Groovy正则使用

作者头像
FunTester
发布2020-03-10 11:58:52
1.2K0
发布2020-03-10 11:58:52
举报
文章被收录于专栏:FunTesterFunTester

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

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

下面分享几个案例:

  • 电子书网站爬虫实践
  • groovy爬虫实例——历史上的今天
  • 爬取720万条城市历史天气数据
  • 记一次失败的爬虫

Java正则

里面用到了一个Java的正则工具类,算是写了Java的正则Demo,代码如下:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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}

}

控制台输出如下:

代码语言:javascript
复制
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”,禁止第三方(腾讯云除外)转载、发表。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java正则
  • Groovy正则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档