java正则任意字符_正则表达式匹配任意字符(包括换行符)的写法
今天在Java中想使用正则表达式来获取一段文本中的任意字符。于是很随意得就写出如下匹配规则:
(.*)
结果运行之后才发现,无法获得换行之后的文本。于是查了一下手册,才发现正则表达式中,“.”(点符号)匹配的是除了换行符“\n”以外的所有字符。同时,手册上还有一句话:要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式。于是我将正则表达式的匹配规则修改如下:
([.\n]*),当然,如果是在java程序中直接写到话,需要改为([.\\n]*)
结果再次运行程序,发现什么内容也取不到了。我百思不得其解,又将其修改为如下规则:
([.|\n]*) 以及 ([\n.]*)
结果还是不行,什么内容都取不到。看来点符号和换行符卯上劲了~
然后上网一查,虽然没有查出上述规则到底是什么地方出问题了,但是查出了一个解决办法,经过一试,果然可以匹配包括换行符在内的任意字符,以下为正确的正则表达式匹配规则:
([\s\S]*)
同时,也可以用 “([\d\D]*)”、“([\w\W]*)” 来表示。
在文本文件里, 这个表达式可以匹配所有的英文
/[ -~]/
这个表达式可以匹配所有的非英文(比如中文)
/[^ -~]/
/是VI里用的. 你在editplus或程序里不需要/
一、小括号()、中括号[]、大括号的区别
最基本的意思:小括号就是括号内看成一个整体 ,中括号就是匹配括号内的其中一个,大括号就是匹配几次(但是括号里变加上其他字符就有不同意思)
(1)小括号():匹配小括号内的字符串,可以是一个,也可以是多个,常跟“|”(或)符号搭配使用,是多选结构的
示例1:string name = "way2014"; regex:(way|zgw) result:结果是可以匹配出way的,因为是多选结构,小括号是匹配字符串的
示例2:string text = "123456789"; regex:(0-9) result:结果是什么都匹配不到的,它只匹配字符串"0-9"而不是匹配数字, [0-9]这个字符组才是匹配0-9的数字
(2)中括号[]:匹配字符组内的字符,比如咱们常用的[0-9a-zA-Z.*?!]等,在[]内的字符都是字符,不是元字符,比如“0-9”、“a-z”这中间的“-”就是连接符号,表示范围的元字符,如果写成[-!?*(]这样的话,就是普通字符
示例1: string text = "1234567890"; regex:[0-9] result:结果是可以匹配出字符串text内的任意数字了,像上边的【或符号“|”在字符组内就是一个普通字符】
示例2:string text = "a|e|s|v"; regex:[a|e|s] result:结果就是匹配字符a、e、|三个字符,这个跟(a|e|s)有区别的,区别就是(a|e|s)匹配的是a、e、s三个字符的随意一个,三个中的任意一个,这是的|是元字符
(3)大括号{}:匹配次数,匹配在它之前表达式匹配出来的元素出现的次数,{n}出现n次、{n,}匹配最少出现n次、{n,m}匹配最少出现n次,最多出现m次
举例详细介绍 例如:
{n}
n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,}
n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m}
m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
?
当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽
可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
在正则匹配中,一般将匹配的字符串称为分组 0,按括号出现的顺序依次将其内容称为分组 1、分组 2……例如正则 /(a)(b)/ 匹配字符串 "ab",则分组 0 为 "ab",分组 1 为 "a",分组 2 为 "b"。执行正则匹配 /(a)(b)/.exec("ab") 的结果 ["ab", "a", "b"] 就是各个分组构成的字符串。如果去掉圆括号就没有分组 1、分组2……结果就是只包含分组 0 即匹配字符串的长度为 1 的数组 ["ab"]。
这里顺便说一下贪婪和非贪婪的匹配原理(注:JAVA默认是贪婪模式):
a)如果是贪婪匹配模式则匹配结果为最长匹配,正则表达式引擎会一直匹配到字符串最后,当匹配为false时,通过回溯的方式,倒退找到倒数第一个匹配位置,返回匹配结果
Java代码
String str = "(a)(b)(c)(d)(e)";
String regex = "\\(.*\\)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println("replace: "+str.replaceAll(regex, "O"));
while (matcher.find()) {
System.out.println("matcher: " + matcher.group(0));
}
输出:
replace:O
matcher: (a)(b)(c)(d)(e)
b)如果是非贪婪匹配模式则匹配结果为最短匹配,正则表达式引擎会匹配到符合pattern的末尾位置那个字符,然后再往后走一步,发现匹配为false, 又回溯到找到回退的最近一个匹配为true的位置,返回结果。
可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。还有一个特殊的组matcher.group(0),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。
Java代码
String str = "(a)(b)(c)(d)(e)";
String regex = "\\(.*?\\)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println("replace: "+str.replaceAll(regex, "O"));
while (matcher.find()) {
System.out.println("matcher: " + matcher.group(0));
int count = matcher.groupCount();
//查看每个匹配串的括号中的内容
for(int i = 0;i<=count;i++){
System.out.print(i+" ");
System.out.println(matcher.group(i));
}
}
输出:
replace: OOOOO
matcher: (a)
matcher: (b)
matcher: (c)
matcher: (d)
matcher: (e)
java正则任意字符_正则表达式匹配任意字符(包括换行符)的写法相关推荐
- java 匹配任意字符_正则表达式匹配任意字符(包括换行符)
正则表达式中,"."(点符号)匹配的是除了换行符"\n"以外的所有字符.但有时候我们需要匹配包括换行符在内的字符,经过一番搜索,发现了几种正则表达式匹配任意字符 ...
- java 正则 括号外_正则表达式匹配括号外的符号及数据
正则表达式匹配括号外的符号 [\\?!/\\.,\\s]+(?=[^\\)]*(\\(|$)) 将括号外的?!/.,和空格(连续多个时同时)匹配 如 String string1 = "sd ...
- python正则匹配任意字符_Python 正则表达式 匹配任意字符的写法
.(句点)匹配除了换行之外的所有一个字符, .*(点-星)匹配除了换行外的所有字符>>> >>> r=re.compile(r'.*') >>> ...
- python正则匹配任意字符_Python 正则表达式 匹配任意字符
.(句点)匹配除了换行之外的所有一个字符, .*(点-星)匹配除了换行外的所有字符 >>> >>> r=re.compile(r'.*') >>> ...
- java 正则 不可见字符_正则表达式匹配不可见字符
在文本中,文字符号分为3种,如表: 普通文字符号 A到Z ,a到z,数字0到9,以及不是元字符的其他符号(比如:#.=) 元字符 12个被保留做特殊用途的符号:[] ...
- java正则出现次数_正则表达式(二)—匹配次数的正则
正则表达式 匹配次数的正则 在前一篇文章中,我们总结了和位置相关的正则,在这篇文章中,我们将继续学习正则表达式其它的内容. 假如现在给你一个regular_1.txt文件,让你找出含有连续2个a的行, ...
- Java通过正则剔除乱码_正则表达式 - 去掉乱码字符/提取字符串中的中文字符/提取字符串中的大小写字母 - Python代码...
目录 1.乱码符号种类较少,用replace() 2.乱码字符种类较多,用re.sub() 3.提取字符串中的中文字符 4.提取字符串中的中文字符和数字 5.提取其他 数据清洗的时候一大烦恼就是数据中 ...
- java正则表达 替换_正则表达式 replace()替换
标签: 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp,replaceme ...
- java 正则 小括号_java正则表达式匹配小括号内的内容
正则表达式用来指定字符串模式.当你需要定位匹配某种模式的字符串时就可以使用正则表达式.例如,我们下面的一个例程就是在一个HTML文件中通过查找字符串模式来定位所有的超链接. 当然,为了指定一种 ...
最新文章
- shell高级编程--引用
- SQL基础操作_7_时间运算
- C语言常用字符串函数
- php获取excel表格中数据的小方法
- c语言实现路由功能,前端路由的两种实现方式,内附详细代码
- 暑假集训-8.05总结
- pyRedis - 操作指南:增/删/改/查、管道与发布订阅功能
- Gsensor/Gyro数据滤波算法思考
- Android中视频播放以及解码
- vue多次引用组件,减少每个页面import的方法
- 人机的根本区别:Free will
- 嵌入式开发<串口调试工具>
- 渠道触点归因、推广来源追踪
- IgnoreActorWhenMoving
- 微信小程序怎么集成腾讯IM
- 这是一份价值上千的python数据分析实战
- Aspose.Cells - 在任何平台上操作Excel电子表格
- css设置按钮样式_使用CSS设置按钮样式的快速指南
- 开源是容器安全面临的最大挑战?|Anchore 软件供应链安全报告解读
- 账龄分析表excel模板_6种数据分析图表,Excel工作表最基础的应用,实用美观职场应用广泛...
热门文章
- HCIA-RoutingSwitching华为认证路由交换工程师(持续更新中2%)
- pycharm库的下载和常见错误
- sel2000服务器自动关闭,管家婆辉煌:轻松处理SQL 2000数据库自动停止
- 特殊古典加密方法解密实践
- U-BOOT启动流程详细分析[转]
- MongoDB 安装报错:无法启动此程序,缺少dll文件
- java 创建 777 权限的目录
- Halcon二维码扫描算法总结
- torch.utils.data.WeightedRandomSampler样本不均衡情况下带权重随机采样
- (文献随笔)肿瘤浸润的活化B细胞抑制结直肠癌的肝转移(Cell Report, 2022年8月30日)