先说下组的概念:

捕获组

捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。

例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。

捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:

((A)(B(C)))

(A)

(B(C))

(C)

可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。

还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。

Java正则表达式匹配模式[贪婪型、勉强型、占有型],默认情况是贪婪模式匹配

贪婪模式表达式:

表达式

含义

X?

X,一次或一次也没有

X*

X,零次或多次

X+

X,一次或多次

X{n}

X,恰好 n 次

X{n,}

X,至少 n 次

X{n,m}

X,至少 n 次,但是不超过 m 次

非贪婪模式表达式:

表达式

含义

X??

X,一次或一次也没有

X*?

X,零次或多次

X+?

X,一次或多次

X{n}?

X,恰好 n 次

X{n,}?

X,至少 n 次

X{n,m}?

X,至少 n 次,但是不超过 m 次

对于这三种匹配模式也有叫: “最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive”。现在将我对这三种匹配模式的理解写出来,并提供一些例子供大家参考。

1、Greediness(贪婪型): 最大匹配

X?、X*、X+、X{n,}都是最大匹配。例如你要用“<.>”去匹配“a

aava abb”,也许你所期待的结果是想匹配“”,但是实际结果却会匹配到“aava ”。这是为什么呢?下面我们跟踪下最大匹配的匹配过程。

①“

②“.+”匹配字符串的“

aava ab”,在进行最大匹配时,它把两个“>”都匹配了,它匹配了所有字符,直到文本的最后字符“b”

③这时,发现不能成功匹配“>”,开始按原路回退,用“a”与“>”匹配,直到“ab”前面的“>”匹配成功。

这就是最大匹配,我们匹配的时候应该看最后面能匹配到哪。

代码示例:

String test = "a

aava abb ";

String reg = "<.>";

System.out.println(test.replaceAll(reg, "###"));

输出:

a###abb

2、Reluctant(Laziness)(勉强型):最小匹配

X?、X*、X+、X{n,}都是最大匹配。好,加个?就成了Laziness匹配。例如X??、X*?、X+?、X{n,}?都是最小匹配,其实X{n,m}?和X{n }?有些多余。

最小匹配意味者,.+? 匹配一个字符后,马上试一试>的匹配可能,失败了,则.+? 再匹配一个字符,再马上试一试>的匹配可能。JDK文档中Greedy 和 Reluctant,它是以eat一口来隐喻的,所以翻译成贪吃和(勉强的)厌食最贴切了。不过我喜欢最大匹配、最小匹配的说法。

代码示例:

String test = "a

aava abb ";

String reg = "<.>";

System.out.println(test.replaceAll(reg, "###"));

输出:

a###aava ###abb

和上面的不同是匹配了两处。

3、Possessive(占有型):完全匹配

与最大匹配不同,还有一种匹配形式:X?+、X*+、X++、X{n,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢。

代码示例:

String test = "a

aava abb ";

String test2 = "

";

String reg = "<.>";

String reg2 = "

";

System.out.println(test.replaceAll(reg, "###"));

System.out.println(test2.replaceAll(reg2, "###"));

输出:

a

aava abb

###

可见。完全匹配是最严格的,必须整个字符串匹配才行。

实例: 获取下面字符串中的大括号中的内容:

{one}{two}{three}

可以这样:

String s = "{one}{two}{three}";

//因为默认为贪婪模式,所以如果没有使用显示()组中的元素不能为大括号([^}]*),而是使用(.*),

//那么会匹配的字符串为:one}{two}{three

Pattern p = Pattern.compile("\\{([^}]*)\\}");

Matcher m = p.matcher(s);

while (m.find()) {

System.out.println(m.group(1));//第一次匹配成功是one,第二次匹配成功是two,第三次匹配为three

}

输出

one

two

three

如果想要三个大括号中的 内容一起输出,可以这样:

String s = "{one}{two}{three}";

Pattern p = Pattern.compile("\\{([^}]*)\\}\\{([^}]*)\\}\\{([^}]*)\\}");

Matcher m = p.matcher(s);

while (m.find()) {

System.out.println(m.group(1) + ", " + m.group(2) + ", " + m.group(3));//获取该次匹配中组(),正则表达式中只有一个(),即只分了一个组

}

输出

one, two, three

关于组的实例:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexMatches

{

public static void main( String args[] ){

// 按指定模式在字符串查找

String line = "This order was placed for QT3000! OK?";

String pattern = "(\\D*)(\\d+)(.*)";

// 创建 Pattern 对象

Pattern r = Pattern.compile(pattern);

// 现在创建 matcher 对象

Matcher m = r.matcher(line);

if (m.find( )) {

//每次匹配成功之后,表示利用pattern 获取到了匹配的字符串,而pattern 中有三个小括号,即有三个

//组,那么每次匹配成功肯定有group(1),group(2),group(3),group(0)是它总是代表整个表达式

System.out.println("Found value: " + m.group(0) );

System.out.println("Found value: " + m.group(1) );

System.out.println("Found value: " + m.group(2) );

System.out.println("Found value: " + m.group(3) );

} else {

System.out.println("NO MATCH");

}

}

}

运行结果如下:

Found value: This order was placed for QT3000! OK?

Found value: This order was placed for QT

Found value: 3000

Found value: ! OK?

java 正则表达式 大括号_java 正则表达式获取大括号之间的内容相关推荐

  1. java正则 括号_java正则表达式获取大括号小括号内容并判断数字和小数亲测可用...

    获取大括号小括号内容 项目开发用到了,暂做个简单记录 private static String regex = "\\{([^}]*)\\}";//匹配大括号 private s ...

  2. java正则表达式 中括号_Java正则表达式获取中括号之间的内容

    不包含中括号 正则表达式如下: \\[(.*?)] 注: .匹配除换行符\n之外的任何单字符: *匹配前面的子表达式零次或多次: ?匹配前面的子表达式零次或一次: ()标记一个子表达式的开始和结束位置 ...

  3. java中正则表达式函数_java正则表达式PHP中的正则表达式函数介绍

    java正则表达式PHP中的正则表达式函数介绍 正则表达式(Regular Expression) 正则表达式系统: 1.POSIX 2.Perl PHP中使用的regex是PCRE: NOTE:PC ...

  4. java正则表达式 引用_java – 正则表达式检索引用的字符串和引用字符

    我有一种语言,它将一个字符串定义为单引号或双引号,通过加倍将字符串转义为字符串中的分隔符.例如,所有以下内容都是合法字符串: 'This isn''t easy to parse.' 'Then Jo ...

  5. java 正则表达式过滤_java正则表达式过滤特殊字符

    Java用正则表达式 过滤特殊字符,只允许中文.字母Java用正则表达式 过滤特殊字符,只允许中文.字母或数字,该怎么写? String s1="我是正确测试数据aasdf2342343AS ...

  6. java 表达式写法_java正则表达式的写法

    展开全部 方法/步骤 Java正则表达式正则表达式的语法知识:Java支持Perl 5 正则表达式语法的一个子集.e69da5e6ba903231313335323631343130323136353 ...

  7. java 并发线程_Java并发教程–线程之间的可见性

    java 并发线程 当在不同线程之间共享对象的状态时,除了原子性外,其他问题也会发挥作用. 其中之一是可见性. 关键事实是,如果没有同步,则不能保证指令按照它们在源代码中出现的顺序执行. 这不会影响单 ...

  8. java 正则 大括号_java正则表达式获取大括号之间的内容

    "; String reg2 = " "; System.out.println(test.replaceAll(reg, "###")); Syst ...

  9. java正则 链接_Java正则表达式获取网址和链接文字解析

    很久不写正则表达式了,网上看到个面试题关于提取, 各种乱七八糟的解法. 正确的,应该是这样吧: import java.util.regex.Matcher; import java.util.reg ...

最新文章

  1. mysql之 mysql 5.6不停机主从搭建(一主一从基于GTID复制)
  2. kubernetes资源控制与及ingress插件安装(容忍策略)
  3. apache的es的原理_Elasticsearch的原理简介
  4. HTML的语义化,你需要深入了解
  5. ascii码01100001_ASCII编码和Unicode编码
  6. 配置View桌面时找不到域的解决方法
  7. c:if test=/c:if 使用
  8. PWN-COMPETITION-HGAME2022-Week1
  9. 优雅的使用Js或CSS处理文本的截断与展示
  10. 要不要使用外键(foreign key )?
  11. 域名申请:一定要进行实名认证吗?
  12. 个人关于PAT的认识心得和体会
  13. CSS3权威指南读书笔记
  14. 抽象类+接口+内部类作业题
  15. 【读书笔记】推荐系统实践·第四章·利用用户标签数据
  16. 嗨,程序员,你知道高级工程师用的搜索引擎吗?
  17. tring转换成Integer numberformatexception 分析
  18. 浅谈人工智能专业,作为普通学生对未来的看法
  19. React学习(六)-React中组件的数据-state
  20. python写简单的脚本-你用 Python 写过哪些牛逼的程序/脚本?

热门文章

  1. Android实现自定义带文字和图片的Button
  2. 【电气专业知识问答】问:高压断路器失灵保护的工作原理是什么?
  3. 基于odoo 环境下的 python 电子签名
  4. Arduino 无源蜂鸣器 音乐播放实验
  5. 查找所有hid设备_如何在线查找几乎所有设备的使用说明书
  6. thinkphp不会识别unsigned int数据类型,会导致sql执行错误
  7. Leetcode:832. Flipping an Image
  8. 在Student中添加TEACHER表
  9. soap soapenv区别_soap soapenv SOAP-ENV 区别
  10. 阿豪学习之:使用xshell连接linux