正则表达式(Regular Expression)详解
1 前言
正则表达式主要用于复杂文本处理,如模式匹配、格式检验、文本替换等。常用的通配符有:
^, $, *, ., , -, +, ?, &, |, (), [], {}
2 String中的split()、matches()、replace()、replaceFirst()、replaceAll()方法
1. split() 方法
public String[] split(String regex) //字符串替换(支持正则表达式)
2. matches()方法
public boolean matches(String regex) //匹配模式串(支持正则表达式)
3. replace()方法
public String replace(char oldChar, char newChar) //替换所有匹配的字符
public String replace(CharSequence target, CharSequence replacement) //替换所有匹配的字符串
不支持正则表达式匹配 ,替换后不改变原串的值,返回一个新的串
4. replaceFirst()方法
public String replaceFirst(String regex, String replacement) //替换第一次匹配的字符串(支持正则表达式)
5. replaceAll()方法
public String replaceAll(String regex, String replacement) //替换所有匹配的字符串(支持正则表达式)
6. replace()方法与replaceAll()方法比较
String s1="12***ab*";
String s2=s1.replace("*","_");
String s3=s1.replaceAll("\\*", "_");
s1: 12***ab*
S2: 12___ab_
s3: 12___ab_
2 正则表达式基本类型
2.1 标准字符集
- \d:任意一个数字(0-9)
- \w:任意一个字母(A-Z,a-z)、数字(0-9)、下划线(_)
- \s:空格、制表符(\t)、换行符(\n)中任意一个
- .:任意字符(除 "\n"),如果要匹配包含 "\n" 在内的所有字符,一般使用 [\s\S]
注意区分大小写,大写表示取反,如:\D表示任意非数字字符
2.2 自定义字符集
[ab5@]:匹配 "a" 或 "b" 或 "5" 或 "@"
[^abc]:匹配 "a"、"b"、"c" 之外的任意字符
[f-k]:匹配 f - k 之间的任意字母
[^a-f0-3]:匹配 a - f, 0 - 3 之外的任意字符
[\d.\-+]:匹配 "0" - "9"、"."、"-"、"+"
注意:
- 除 "^"、"-"、"" 外的特殊符号,如果被包含在 "[ ]" 中,将失去其特殊意义,当做普通字符处理;
- 除 "." 以外的标准字符集,如果被包含在 "[ ]" 中,自定义字符集将包含该标准字符集。
2.3 量词
- {n}:表达式重复 n 次
- {m,n}:表达式至少重复 m 次,至多重复 n 次
- {m,}:表达式至少重复 m 次
- ?:表达式重复0次或1次,相当于
- +:表达式至少出现一次,相当于
- *:表达式不出现或出现任意次,相当于
\d{3}:匹配3位整数,相当于"\d\d\d"
\d\d{3}:匹配4位整数
(\d\d){3}:匹配6位整数
a\d?b:匹配 "ab", "a0b", "a5b", "a7b"等
2.4 字符边界
- ^:与字符串开始的地方匹配
- $:与字符串结束的地方匹配
- \b:匹配一个单词边界(匹配一个位置:前面的字符和后面的字符不全是\w)
2.5 选择与分组
- |:a|b,匹配 a 或 b
- ():用于将多个字符作为一个整体
2.6 预搜索(零宽断言)
- (?=exp):断言自身出现的位置后面能匹配表达式 exp
- (?<=exp):断言自身出现的位置前面能匹配表达式 exp
- (?!exp):断言自身出现的位置后面不能匹配表达式 exp
- (?<!exp):断言自身出现的位置前面不能匹配表达式 exp
注意:只进行表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度。
待测串:having eating going singsing
模式串:[a-z]+(?=ing)
匹配串:hav eat go s
3 简单案例
问题描述:给一个字符串 s ,删除字母、数字、减号之外的字符,删除连续两个及以上的减号,删除孤立的减号,使得每个单词仍保持原来的意义。如 " -i- -- am- @__#$ 19-years - -old_ _ _ " ,经处理后,得到 "i am 19-years old".
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
s=s.replaceAll("[^a-zA-Z0-9\\-]"," "); //替换所有非字母、数字、减号字符为空格
s=s.replaceAll("\\-{2,}", " "); //替换连续2个及以上的减号为空格
s=s.replace("- ", " "); //替换"- "为空格
s=s.replace(" -", " "); //替换" -"为空格
s=s.replaceAll("\\s+"," "); //替换连续1个及以上的空字符(空格、\t、\n)为空格
s=s.trim(); //删除首尾多余的空格
if(s.charAt(0)=='-') {
s=s.replaceFirst("-",""); //删除字符串头的"-"
}
System.out.println(s);
}
}
-i- -- am- @ __#$ 19-years - -old_
i am 19-years old
声明:本文转自正则表达式(Regular Expression)详解
正则表达式(Regular Expression)详解的更多相关文章
- Jmeter 正则表达式提取器详解(Regular Expression Exactor)
Jmeter 正则表达式提取器详解(Regular Expression Exactor) Name(名称):随意设置,最好有业务意义. Comments(注释):随意设置,可以为空 Apply to ...
- hibernate Expression详解
关键字: hibernate expression hibernate Expression详解Expression.gt:对应SQL条件中的"field > value " ...
- JMeter 后置处理器之正则表达式提取器详解
后置处理器之正则表达式提取器详解 by:授客 QQ:1033553122 1. 添加正则表达式提取器 右键线程组->添加->后置处理器->正则表达式提取器 2. 提取器配置介绍 ...
- Java基础-正则表达式(Regular Expression)语法规则简介
Java基础-正则表达式(Regular Expression)语法规则简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正则表达式的概念 正则表达式(Regular Exp ...
- 正则表达式-Regular expression学习笔记
正则表达式 正则表达式(Regular expression)是一种符号表示法,被用来识别文本模式. 最近在学习正则表达式,今天整理一下其中的一些知识点 grep - 打印匹配行 grep 是个很强大 ...
- 正则表达式(Regular Expression, RegEx)学习入门
1. 概述 正则表达式(Regular Expression, RegEx)是一种匹配模式,描述的是一串文本的特征. 正如自然语言中高大.坚固等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽 ...
- Python正则表达式Regular Expression基本用法
资料来源:http://blog.csdn.net/whycadi/article/details/2011046 直接从网上资料转载过来,作为自己的参考.这个写的很清楚.先拿来看看. 1.正则表 ...
- C#中【正则表达式regular expression】相关的知识
Regex System.Text.RegularExpressions.Regex regex应该是regular expression的缩写 https://msdn.microsoft ...
- java 正则表达式 -Regular Expression
正则表达式(Regular Expression),可以说就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式.正则表达式定义了字符串的模式,可以用来搜索.编辑或处理文本,不仅限于某一种语言(P ...
- Python -- 正则表达式 regular expression
正则表达式(regular expression) 根据其英文翻译,re模块 作用:用来匹配字符串. 在Python中,正则表达式是特殊的字符序列,检查一个字符串是否与某种模式匹配. 设计思想:用一 ...
随机推荐
- 03-ASIC和FPGA中的时钟结构
1 ASIC 中时钟的结构 ASIC电路中的时钟的结构.这是一个非常典型的MCU的时钟结构图.它的时钟结构和功能的划分.首先,我们通过外部振荡器发送了一个8MHz的时钟给PLL,经过分分频和倍频产生更 ...
- 【STM32】如何将资源烧写至外部flash,如spi-flash
STM32将资源烧写至外部flash方式大致分为通过IDE与应用程序一起和通过CubeProgranmmer单独烧写两种: 方式一.使用IDE加载烧写算法,烧录应用程序时一并写入,具体就是修改分散加载 ...
- 银河麒麟安装nmon以及rpc.rstatd的方法
背景说明 随着公司业务的发展,需要在ARM环境上面进行性能测试. 为了进行ARM环境的验证,需要一些组件进行资料收集. 比较好的方式是使用nmon或者是rstatd进行性能参数收集. 为了方便部署,想 ...
- 日志框架简介-Slf4j+Logback入门实践 | 京东云技术团队
前言 随着互联网和大数据的迅猛发展,分布式日志系统和日志分析系统已广泛应用,几乎所有应用程序都使用各种日志框架记录程序运行信息.因此,作为工程师,了解主流的日志记录框架非常重要.虽然应用程序的运行结果 ...
- 【k哥爬虫普法】程序员183并发爬取官方网站,直接获刑3年?
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- 2022美亚杯个人wp
检材文件下载链接:https://pan.baidu.com/s/1kg8FMeMaj6BIBmuvUZHA3Q?pwd=ngzs 提取码:ngzs 个人赛与团队赛下载文件解压密码:MeiyaCup2 ...
- 🛠 开源即时通讯(IM)项目OpenIM源码部署指南
OpenIM的部署涉及多个组件,并支持多种方式,包括源码.Docker和Kubernetes等.这要求在确保不同部署方式之间的兼容性同时,还需有效管理各版本之间的差异.确实,这些都是复杂的问题,涉及到 ...
- [3] 以逆向的角度来看循环语句——do、while、for的比较
[3] 以逆向的角度来看循环语句--do.while.for的比较 1. do循环 先执行循环体,后比较判断 #include <stdio.h> int main(int argc, ...
- 为不同版本python安装pip的正确做法
想学习Python3,但是暂时又离不开Python2.在Windows上如何让它们共存呢? 目前国内网站经常会让大家把其中一个python.exe改个名字(嗯,我也这样讲过,在此纠正一下),这样区分开 ...
- 遇到一个bug,组件不更新内容
解决办法 当v-if的值发生变化时,组件都会被重新渲染一遍.因此,利用v-if指令的特性,可以达到强制刷新组件的目的. <template> <comp v-if="upd ...