今天在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正则任意字符_正则表达式匹配任意字符(包括换行符)的写法相关推荐

  1. java 匹配任意字符_正则表达式匹配任意字符(包括换行符)

    正则表达式中,"."(点符号)匹配的是除了换行符"\n"以外的所有字符.但有时候我们需要匹配包括换行符在内的字符,经过一番搜索,发现了几种正则表达式匹配任意字符 ...

  2. java 正则 括号外_正则表达式匹配括号外的符号及数据

    正则表达式匹配括号外的符号 [\\?!/\\.,\\s]+(?=[^\\)]*(\\(|$)) 将括号外的?!/.,和空格(连续多个时同时)匹配 如 String string1 = "sd ...

  3. python正则匹配任意字符_Python 正则表达式 匹配任意字符的写法

    .(句点)匹配除了换行之外的所有一个字符, .*(点-星)匹配除了换行外的所有字符>>> >>> r=re.compile(r'.*') >>> ...

  4. python正则匹配任意字符_Python 正则表达式 匹配任意字符

    .(句点)匹配除了换行之外的所有一个字符, .*(点-星)匹配除了换行外的所有字符 >>> >>> r=re.compile(r'.*') >>> ...

  5. java 正则 不可见字符_正则表达式匹配不可见字符

    在文本中,文字符号分为3种,如表: 普通文字符号     A到Z ,a到z,数字0到9,以及不是元字符的其他符号(比如:#.=) 元字符               12个被保留做特殊用途的符号:[] ...

  6. java正则出现次数_正则表达式(二)—匹配次数的正则

    正则表达式 匹配次数的正则 在前一篇文章中,我们总结了和位置相关的正则,在这篇文章中,我们将继续学习正则表达式其它的内容. 假如现在给你一个regular_1.txt文件,让你找出含有连续2个a的行, ...

  7. Java通过正则剔除乱码_正则表达式 - 去掉乱码字符/提取字符串中的中文字符/提取字符串中的大小写字母 - Python代码...

    目录 1.乱码符号种类较少,用replace() 2.乱码字符种类较多,用re.sub() 3.提取字符串中的中文字符 4.提取字符串中的中文字符和数字 5.提取其他 数据清洗的时候一大烦恼就是数据中 ...

  8. java正则表达 替换_正则表达式 replace()替换

    标签: 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp,replaceme ...

  9. java 正则 小括号_java正则表达式匹配小括号内的内容

    正则表达式用来指定字符串模式.当你需要定位匹配某种模式的字符串时就可以使用正则表达式.例如,我们下面的一个例程就是在一个HTML文件中通过查找字符串模式来定位所有的超链接.     当然,为了指定一种 ...

最新文章

  1. shell高级编程--引用
  2. SQL基础操作_7_时间运算
  3. C语言常用字符串函数
  4. php获取excel表格中数据的小方法
  5. c语言实现路由功能,前端路由的两种实现方式,内附详细代码
  6. 暑假集训-8.05总结
  7. pyRedis - 操作指南:增/删/改/查、管道与发布订阅功能
  8. Gsensor/Gyro数据滤波算法思考
  9. Android中视频播放以及解码
  10. vue多次引用组件,减少每个页面import的方法
  11. 人机的根本区别:Free will
  12. 嵌入式开发<串口调试工具>
  13. 渠道触点归因、推广来源追踪
  14. IgnoreActorWhenMoving
  15. 微信小程序怎么集成腾讯IM
  16. 这是一份价值上千的python数据分析实战
  17. Aspose.Cells - 在任何平台上操作Excel电子表格
  18. css设置按钮样式_使用CSS设置按钮样式的快速指南
  19. 开源是容器安全面临的最大挑战?|Anchore 软件供应链安全报告解读
  20. 账龄分析表excel模板_6种数据分析图表,Excel工作表最基础的应用,实用美观职场应用广泛...

热门文章

  1. HCIA-RoutingSwitching华为认证路由交换工程师(持续更新中2%)
  2. pycharm库的下载和常见错误
  3. sel2000服务器自动关闭,管家婆辉煌:轻松处理SQL 2000数据库自动停止
  4. 特殊古典加密方法解密实践
  5. U-BOOT启动流程详细分析[转]
  6. MongoDB 安装报错:无法启动此程序,缺少dll文件
  7. java 创建 777 权限的目录
  8. Halcon二维码扫描算法总结
  9. torch.utils.data.WeightedRandomSampler样本不均衡情况下带权重随机采样
  10. (文献随笔)肿瘤浸润的活化B细胞抑制结直肠癌的肝转移(Cell Report, 2022年8月30日)