java中的正则表达式 java.util.regexJava中正则表达式的构造-世界热点评
介绍
前段时间使用Java的正则表达式做一些字符串匹配的任务,现将学到的正则表达式的知识整理成文。
Java中Spring.class涉及到正则表达式。如Spring.split(), matches(),replaceAll()等方法。
(资料图片仅供参考)
Java中更一般使用正则表达式的方式是利用Pattern.class和Matcher.class,所在package为java.util.regex
Java中正则表达式相关API使用不难掌握,不过重点在于编写合适的正则表达式,尤其是利用字符类和量词的使用。
正则表达式
Java中正则表达式与之前使用的Python是有区别的,区别在于Java对于反斜线(\)处理的不同。 在Python中"\d"表示 匹配一位数字(0-9),而Java中匹配一位数字(0-9),需要的正则表达式为"\\d"。 不过换行符和制表符只需要单反斜线“\n\t”。
字符
给出构造正则表达式的常用字符
字符描述
B指定字符B
\xhh十六进制值为oxhh的字符
\uhhhh十六进制值为oxhhhh的Unicode字符
\ttab
\n换行
\r回车
\e转义
字符类
字符类在编写正则表达式起到重要的作用,我们给出一些常用的构造正则表达式的字符类。
字符类描述
. (小数点)任意字符
[abc][ ] 中括号,包含a,b,c中任意字符
[^abc][ ]中括号加^, 表示否定,除a,b,c之外的
[a-z]从a到z的任意字符
[a-z&&[hi]]&&表示交集,即包含h或i
\s空白字符,包含空格,换行,回车,tab,换页
\S大写为小写的取反,非空白字符,等价于[^\s]
\d数字0-9
\D非数字,等价于[^0-9]
\w词字符,数字,大小写字母,等价于[0-9a-zA-Z]
\W非词,等价于[^\w]
逻辑操作符
组合一个或多个表达式,通过逻辑操作符实现。
逻辑操作符描述
XYY跟在X后面,并且XY同时满足
X|YX或者Y
(X)() 小括号表示捕获组(group),可以对group进行处理,尤其是获取其中的内容
边界匹配符
针对边界的匹配,给出边界匹配符。
边界匹配符描述
^一行的开始
$一行的结束
\b词的边界
量词
量词描述了一个模式匹配文本的方式,包含
贪婪型:量词默认是贪婪的,发现尽可能多的匹配勉强型:通过问号(?)指定,匹配最小的字符数,也称为懒惰型,最少匹配,非贪婪。占有型:通过加号(+)指定,当用于字符串时防止匹配失败时回溯。
贪婪型勉强型占有型描述
X?X??X?+匹配0个或1个X
X*X*?X*+匹配0个或多个X
X+X+?X++匹配1个或多个X
X{n}X{n}?X{n}+恰好匹配n个X
X{n,}X{n,}?X{n,}+至少匹配n个X
X{n,m}X{n,m}?X{n,m}+至少匹配n个X,最多匹配m个X
正则表达式使用
String
String.class提供了一些方法,如用于切分的split()方法,用于验证是否匹配的matches()方法,用于替换操作的replaceAll方法。简单示例如下:
/** * String中正则表达式的测试 * * @throws Exception 异常情况 */ @Test public void testStringRegex() throws Exception { // split // 结果:[some, examples, of, regex, test] String query = "some examples of regex test"; String[] parts = query.split(" "); System.out.println(Arrays.toString(parts)); // matches 整个字符串是否匹配 // 结果:false String regex = "regex"; boolean isMatched = query.matches(regex); System.out.println(isMatched); // replaceAll // 结果:someexamplesofregextest String replaceQuery = ""; String newQuery = query.replaceAll(" ", replaceQuery); System.out.println(newQuery); }
Pattern和Matcher
正则表达式更一般的用法是使用*java.util.regex.*下的Matcher和Pattern类。
通过Pattern类的静态方法static Pattern.compile()编译正则表达式,利用Pattern的*matcher()*方法生产Matcher对象。根据Matcher对象提供的API完成相应的操作。
我们以获取字符串中的电话号码和Html中的标题为例,实现正则表达式的匹配。示例如下:
package com.notepad.thinkingnote.regexes;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * Description: 正则表达式 * * Create: 2018/8/25 21:37 * * @author Marvin Yang */public class RegexUtils { /** * 获取content中全部的手机号码 * * @param content 待匹配内容 * @return 电话号码集合 */ public ListgetPhoneNumber(String content) { ListphoneNumbers = new ArrayList<>(); Matcher matcher = PHONE_PATTERN.matcher(content); while (matcher.find()) { // group=2对应(1\\d{10}), 匹配的值即为手机号码 phoneNumbers.add(matcher.group(2)); } return phoneNumbers; } /** * 从Html中获取title * * @param content a html * @return the title of a html */ public String getHtmlTitle(String content) { Matcher matcher = TITLE_PATTERN.matcher(content); return matcher.find()? matcher.group(1):null; } /** 手机号码 */ private static final String PHONE_REGEX = "(^|\\D)(1\\d{10})($|\\D)"; private static final Pattern PHONE_PATTERN; /** html 标题 */ private static final String HTML_TITLE_REGEX = ""; private static final Pattern TITLE_PATTERN; static { PHONE_PATTERN = Pattern.compile(PHONE_REGEX); // 不区分大小写 TITLE_PATTERN = Pattern.compile(HTML_TITLE_REGEX, Pattern.CASE_INSENSITIVE); }}
构造单测样例如下:
package com.notepad.thinkingnote.regexes;import org.junit.Test;import java.util.Arrays;import java.util.List;import static org.junit.Assert.*;/** * Description: 正则表达式单测 * * Create: 2018/8/25 21:45 * * @author Marvin Yang */public class RegexUtilsTest { private RegexUtils regexUtils = new RegexUtils(); @Test public void getPhoneNumber() { // test 1: 有电话号码 String content = "紧急情况请拨打13845697569"; ListphoneNumbers = regexUtils.getPhoneNumber(content); System.out.println(String.format("[%s] has phone number : [%s]", content, phoneNumbers)); // test 2: 数字12位 content = "紧急情况请拨打138456975690"; phoneNumbers = regexUtils.getPhoneNumber(content); System.out.println(String.format("[%s] has phone number : [%s]", content, phoneNumbers)); // test 3: 开头不是1 content = "紧急情况请拨打23845697569"; phoneNumbers = regexUtils.getPhoneNumber(content); System.out.println(String.format("[%s] has phone number : [%s]", content, phoneNumbers)); // test 4: 数字在开头 content = "13845697569紧急情况请拨打"; phoneNumbers = regexUtils.getPhoneNumber(content); System.out.println(String.format("[%s] has phone number : [%s]", content, phoneNumbers)); } @Test public void getHtmlTitle() throws Exception { // test 1: 正常情况 String content = ""; String title = regexUtils.getHtmlTitle(content); System.out.println(String.format("get title [%s] from content: [%s]", title, content)); // test 1: 不区分大小写 content = ""; title = regexUtils.getHtmlTitle(content); System.out.println(String.format("get title [%s] from content: [%s]", title, content)); }}
总结
本文对Java的正则表达式的使用进行了简单的介绍,已经利用Pattern和Matcher进行匹配的样例。当然重要的还是正则表达式的编写,不一定非得很复杂, 重点是适合我们处理的问题。
标签: 正则表达式
相关推荐:
最新新闻:
- 当前动态:一站式的开源持续测试平台---MeterSphere
- 【干货】常见密码归纳(入门级)(上)-世界滚动
- 代码执行的意思是什么?代码执行详情介绍 环球快报
- 【java编程】使用系统函数的两种方式_世界快消息
- finally的作用是什么?java异常处理之finally
- 【天天报资讯】零、分析方法基础——PEST分析法(行业分析篇)
- 几何学中多项式是什么?多项式是由变量以及标量的代数式吗?-焦点热文
- 链表中结点的“结”到底是哪个字?节点和结点到底有什么不同?
- 深入理解Java:SimpleDateFormat安全的时间格式化
- 【干货】C++异常处理的三种工具
- 环球微速讯:CART树算法详解 基于训练数据集生成的CART算法
- 中国最出色的互动娱乐企业之一——完美世界-每日视讯
- 智搭36合1创意搭建机器人——STEAM教育的完美课题-热资讯
- HSE配置是什么?频率4-16MHZ的使用方法
- 园方回应游客给大熊猫投喂带包装火腿肠:很气愤!
- 这款Steam新作 展现了俄罗斯人眼中的黑暗格林童话
- java中的正则表达式 java.util.regexJava中正则表达式的构造-世界热点评
- 天天看热讯:干货|MindSporeLite整体架构介绍
- 高效的磁力搜索引擎--生产中的测试(二)_全球今日报
- 《街头霸王6》新解说员宣传片公开:日本少女冠军人美声甜!-天天快报
- 《怪物猎人崛起:曙光》主机发售日公开_天天精选
- 环球热头条丨《最后的生还者》PC重制版预告 配置需求公布
- 多人团队射击《恐龙浩劫》将于7月14日正式发售|世界新消息
- 《机械战警:暴戾都市》公布玩法预告延期至9月上市|每日热文
- 床头必备 奥克斯22升小冰箱258元
- 超高颜值 华硕小主机2999元|全球快看点
- 战纹2公布 登录Switch和PC_当前快讯
- 3D打印火箭即将试射
- 百亿补贴便宜100 机械师24寸显示器399元
- 快看点丨复仇爽剧《黑暗荣耀2》明天全集播出:第1季豆瓣8.9
- 【世界独家】internal_server error怎么办
- 《零:月蚀的假面》发售预告片公布 已登陆各平台_热头条
- Epic 2022年度总结:PC用户超2.3亿!送出99款游戏_聚焦
- 固定视角生存恐怖游戏《生者回声》试玩推出 世界时快讯
- 防止App恶意截图 安卓14预览版新功能
- 全球今日报丨万众期待 星空跳票到9月6日
- Homepod对手来了 SONOS新品支持空间音频
- 世界快资讯:电动提取灵魂 音波头部按摩仪149元
- 全球快资讯:索尼担忧微软收购之后COD在PS5上会更差
- 没有五险一金的公司能去吗上班_没有五险一金的公司能去吗
- 热点评!扁平疣的最佳治疗方法是什么(扁平疣的最佳治疗方法)
- 环球速读:《战争雷霆》衍生VR空战游戏《雷霆王牌》公布
- 时讯:传闻:《怪猎崛起:曙光》将于4月28日登陆PS/Xbox
- 【环球新要闻】每天少睡一两个小时算熬夜?专家提醒:大脑会变笨
- 当前头条:U20男足亚洲杯:中国队晋级八强!
- 《闪电十一人》最新作剧情来到初代25年后-世界新资讯
- 天天速递!韩国主帅希望复制02世界杯奇迹:之前能 现在也可以
- 市场监管总局公布第六批查处涉疫药品和医疗用品违法典型案例
- 世界百事通!140W 4060满血释放!ROG新款游戏本首发价9999元
- 腾讯NFT交易软件幻核APP凉了:将于6.30关闭下线
- 美洽代表成都高新区企业,出海赴欧开拓新市场
- 毕设在即,电脑硬盘崩了,有哪款比较值得购买的SSD?:世界信息
- iPhone 14 Plus黄色刚发布就破发:立减800 当前观点
- 小米Buds 4 Pro无线耳机即将在国际市场推出、支持蓝牙5.3:观速讯
- Nacon发行商折扣周1折起 《钢铁崛起》75.9元|环球速递
- 数据显示:67%的《卧龙》Xbox玩家没能击败张梁
- 全球动态:游戏囧图:单马尾蒂法好凶 双生舞伶本尊COS来了
- 欺骗感情!90后男子承诺捐1100万没兑现成老赖:985母校怒起诉|焦点
- 环球观速讯丨黑暗童话《惊悚故事3:英格莉忏悔录》今日登陆Steam
- 矿卡崩了也没事!英伟达自信表态:我们游戏显卡也很行-天天热推荐
- 停止续约!米兰体育报:“现在不应该分心,应当全力...
- 焦点热门:PS中国发布《卧龙:苍天陨落》PS5性能宣传片 沉浸体验乱世三国
- 《生化危机4:重制版》广告疑似泄露:试玩Demo明天上线!_每日精选
- 当前信息:《蓓优妮塔起源:瑟蕾莎与迷失的恶魔》公布剧情预告片
- 重获新“声” 清华研发可穿戴人工喉咙还原准确率超90%
- 点亮尘封文明 解谜游戏《落叶城》NS版3月16日推出:快看
- 兼容 13 代酷睿,昂达推出两款主板,售价仅 449 元起
- 独居女生的浪漫之选三星BESOPKEHOME让女性拥抱自我-每日头条
- 聚焦女性健康,腾讯公益“关爱女性健康小红花日”项目启动
- 天天要闻:直降 1000 元,ROG 6 游戏手机优惠抢购,16GB+512GB 豪华配置
- iPhone 攻下日本手机一半市场,第二名夏普,小米等国产机只在 others
- 每日观点:梁朝伟称想重新尝试拍电视剧:美剧、韩剧都可接受
- 外媒:《星空》延期至9月恰好避开了大作云集的夏季
- 《原子之心》双生舞伶扮演者COS自己 自称闲暇时也会玩游戏-今头条
- 环球资讯:时隔4个月富坚义博重新公布进展 《全职猎人》新话缓慢更新