下面由一个例子引出非捕获组。

有两个金额:8899¥。显然,前一个是8899元的人民币,后一个是6688元的美元。我现在需要一个正则,要求提炼出它们的货币金额和货币种类。正则可以这写:(\\d)+([¥$])$  (在Java中测试,所以多了转义字符'\'),最后一个$是字符串结束
测试程序如下:

package test;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class main
{public static void main(String[] args){Pattern p = Pattern.compile("(\\d+)([¥$])$");//
        String str = "8899¥";Matcher m = p.matcher(str);if (m.matches()){System.out.println("货币金额: " + m.group(1));System.out.println("货币种类: " + m.group(2));}}}

输出结果为:

货币金额: 8899
货币种类: ¥

OK,满足了要求。这里的正则分成了两个组,一个是(\\d+),一个是([¥$]),前一个组匹配货币金额,后一个组匹配货币种类。

现在,我需要这个正则可以匹配浮点数。如8899.56¥。我们都知道,现在少于一元钱基本上买不到东西了,所以我希望忽略小数部分,正则还是提炼出 8899 和 ¥。
那么正则如下:
(\\d+)(\\.?)(\\d+)([¥$])$
这里用括号分了四组,所以要输出货币金额的整数部分和货币种类,要分别输了group(1),group(4)了。如果输出部分和正则是分开的,我希望只修改正则而不去修改输出部分的代码,也就是还是用group(1),group(2)作为输出。由此可以引出非捕获组(?:)。
把前面的正则修改为:
(\\d+)(?:\\.?)(?:\\d+)([¥$])$
这样,还是用group(1),group(2)做为输出,同样输出了 8899 和 ¥
这个正则的中间两个组用到的就是非捕获组(?:),它可以理解为只分组而不捕获。

当然也可以用命名分组,这样直观一点.

package test;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class main
{public static void main(String[] args){Pattern p = Pattern.compile("(?<money>\\d+)(?:\\.?)(?:\\d+)(?<type>[¥$])$");//
        String str = "8899.56¥";Matcher m = p.matcher(str);if (m.matches()){System.out.println("货币金额: " + m.group("money"));System.out.println("货币种类: " + m.group("type"));}}}

转载于:https://www.cnblogs.com/ptqueen/p/7020828.html

捕获分组和非捕获分组以及命名分组相关推荐

  1. 【正则表达式系列】一些概念(字符组、捕获组、非捕获组)

    前言 本文介绍一些正则中的常用名词以及对应概念,譬如字符组,捕获组.非捕获组.反向引用.转义和\s \b等 大纲 字符组 捕获组 反向引用 非捕获组 ..\s和\S \b \转义 字符组 []字符组表 ...

  2. 正则表达式捕获分组和非捕获分组及用法

    正则表达式 (regular expression)是一个描述字符模式的对象. ECMAScript 的 RegExp 类 表示正则表达式,而 String 和 RegExp 都定义了使用正则表达式进 ...

  3. java正则表达式基础 关于特殊字符、捕获组和非捕获匹配

    JAVA正则表达式 我个人认为正则表达式是很好用很强大的,在编写程序中很多地方都用的到,这里有一些我学习的基础理解和大家分享,欢迎一起讨论. 正则表达式是一种用来表达语法规则的字符串,是一种字符串匹配 ...

  4. php 正则匹配分组命名,正则表达式、分组、子匹配(子模式)、非捕获子匹配(子模式)...

    前面我们知道正则表达式有很多元字符表示匹配次数(量词),都是可以重复匹配前面出现的单个字符次数.有时候,我们可能需要匹配一组多个字符一起出现的次数.这个时候,我们需要分组了.就是用小括号来括起这些字符 ...

  5. 正则表达式中的非捕获组是什么?

    非捕获组(即(?:) )如何在正则表达式中使用,它们有什么用? #1楼 在复杂的正则表达式中,您可能会希望使用大量的组,其中一些用于重复匹配,而另一些则提供反向引用. 默认情况下,与每个组匹配的文本会 ...

  6. 【整理】Python中的re.search和re.findall之间的区别和联系 + re.finall中带命名的组,不带命名的组,非捕获的组,没有分组四种类型之间的区别

    之前自己曾被搞晕过很多次. 后来使用这些函数次数多了之后,终于比较清楚的弄懂了两者之间的区别和关系了. 尤其是一些细节方面的注意事项了. 在看下面的总结和代码之前,请先确保你对如下基本概念已经有所了解 ...

  7. 正则表达式的非捕获性分组

    非捕获性分组,通常由一对括号加上 ?: 加上子表达式组成,非捕获性分组不会创建反向引用,就好像没有括号一样.如下: var color = "#808080"; var outpu ...

  8. 正则表达式 非捕获性分组

    非捕获性分组语法为(?:pattern),即将pattern部分组合成一个可统一操作的组合项,但不把这部分内容当作子匹配捕获,匹配的内容部进行编号也不存储在缓冲区中供以后使用.非捕获性分组方法在必须进 ...

  9. 十分钟掌握正则表达式!4_分组匹配_捕获形分组

    javascript正则表达式 1.分组 1.1.候选:一个分组中,可以有多个候选表达式,用|分隔: 1.2.捕获与引用: 1.2.1 与replace配合: 1.2.2 给replace传迭代函数, ...

最新文章

  1. 7-Zip 19.00 正式版发布,修正 Win10 1809(17763) 可能无法正常使用大内存页
  2. 5G中网络切片技术是什么?—Vecloud
  3. Redis缓存穿透、击穿、雪崩及主从复制
  4. 李东生:管理者不能变成诸葛先生
  5. 2019春季季节跳动招聘笔试(回忆版)第二题
  6. 分享一个HTML5画布实现的超酷文字弹跳球效果
  7. python跨目录调用_python 跨目录访问文件
  8. heap c语言数组实现,垃圾回收算法实现之 - 分代回收(完整可运行C语言代码)...
  9. oracle20g,GaussDB 100 OLTP: 缩减创建数据库的20G空间需求及GS-00714
  10. Java操作zip压缩和解压缩文件工具类
  11. TextView用法及实例
  12. C语言指针 与字符串的学习
  13. matlab数据类型single vs double
  14. WPF自定义分页控件
  15. ioi 赛制_《Produce48》现坑爹赛制 网友称这波操作令人窒息
  16. springboot 过滤器
  17. 2022-2028全球与中国自动输送分拣系统市场现状及未来发展趋势
  18. 牛刀小用: 朱砂掌治内痔
  19. (PTA)7-7 计算油费 (15分)
  20. 劝学篇翻译软件测试,古今贤文劝学篇翻译

热门文章

  1. 计算机网络实验二:应用层和传输层网络协议分析
  2. 计算机视觉与深度学习 | 基于CAMShift的人脸检测与跟踪(Matlab版)
  3. 安装 | MatlabR2019b: License Manager Error -8. License checkout failed.
  4. 北斗导航 | GPS原理与接收机设计——琉璃剑之剑气回肠
  5. java 登录 https_java – 如何在Web应用程序中实现HTTPS登录页面?
  6. python 机器学习 爬取关键字_5行Python就能爬取 3000+ 上市公司的信息?
  7. 小鸡模拟器 android,安卓小鸡模拟器运行总结~
  8. mysql数据每日更新_[每日更新-MySQL]4.记录操作(数据操作)
  9. 图的存储结构matlab,matlab存储 一幅图像的的函数为( )
  10. web开发入门到深入-WebAssembly(1)