当前位置: 首页 > 工具软件 > chtml-matcher > 使用案例 >

Java(60):Java 正则表达式(Pattern和Matcher)

那铭
2023-12-01

Java(60):Java 正则表达式

一、Pattern类和Matcher类

Java的正则表达式是由java.util.regex的Pattern和Matcher类实现的。Pattern对象表示经编译的正则表达式。静态的compile( )方法负责将表示正则表达式的字符串编译成Pattern对象。

####只要给Pattern.matcher( )方法传一个字符串就能获得Matcher对象。接下来就能用Matcher的方法来查询匹配的结果了###。

boolean matches()
boolean lookingAt()
boolean find()
boolean find(int start)

Matcher.matches()/ Matcher.lookingAt()/ Matcher.find()

Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false 
matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true 

lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true 

find()对字符串进行匹配,匹配到的字符串可以在任何位置

Mathcer.start()/ Matcher.end()/ Matcher.group()

当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信息. 
start()返回匹配到的子字符串在字符串中的索引位置. 
end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置. 
group()返回匹配到的子字符串 

Mathcer类还有一个groupCount()用于返回有多少组。

只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.

1、Pattern类的matches()示例:

 .*name.* 用于查找字符串中是否包了name 子串

String pattern = ".*name.*";
String content = "my name is ${name}";

boolean flag = Pattern.matches(pattern, content);
System.out.println(flag);

打印:true

2、Pattern类Pattern.matcher( )方法创建Matcher对象。

2.1、Matcher类的matches 和 lookingAt 方法示例

matches 和 lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是 matches 要求整个序列都匹配,而lookingAt 不要求。

lookingAt 方法虽然不需要整句都匹配,但是需要从第一个字符开始匹配。

这两个方法经常在输入字符串的开始使用。

// 创建 Pattern 对象
Pattern p=Pattern.compile("\\$\\{(.*?)\\}");  
//创建Matcher对象
Matcher m1=p.matcher("my name is ${name}");
Matcher m2=p.matcher("${name} is hu");
System.out.println(m1.lookingAt());    //从第一个字符开始匹配,第一个未匹配到
System.out.println(m2.lookingAt());    //要求整个序列都匹配
System.out.println(m2.matches());      //要求整个序列都匹配,正好从第一个开始匹配到了。

打印:

false
true
false

2.2、Matcher类的find()示例

Matcher.find( )的功能是发现CharSequence里的,与pattern相匹配的多个字符序列

        //创建Pattern对象
        Pattern p=Pattern.compile("\\$\\{(.*?)\\}");
        //创建Matcher对象
        Matcher m1=p.matcher("my name is ${name}");
        System.out.println(m1.find());

打印:true

m1.find()只会执行一次,如果前面需要打印,下面还需要遍历,建议此处用boolean flag获取后,再打印

2.3、find()捕获组

find( )像一个迭代器,从头到尾扫描一遍字符串。第二个find( )是带int参数的,正如你所看到的,它会告诉方法从哪里开始找——即从参数位置开始查找。

        //创建Pattern对象
        Pattern p=Pattern.compile("\\$\\{(.*?)\\}");
        //创建Matcher对象
        Matcher m1=p.matcher("my name is ${name}");
        while(m1.find()) {
            System.out.println("Found value: " + m1.group());
            System.out.println("Found value: " + m1.group(0));
            System.out.println("Found value: " + m1.group(1) );
        }

打印:

Found value: ${name}                --->匹配全值
Found value: ${name}                --->匹配全值
Found value: name                    --->匹配(.*?)里的值。

备注:

Groups

Group是指里用括号括起来的,能被后面的表达式调用的正则表达式。Group 0 表示整个表达式,group 1表示第一个被括起来的group,以此类推。所以;

A(B(C))D

里面有三个group:group 0是ABCD, group 1是BC,group 2是C。

你可以用下述Matcher方法来使用group:

public int groupCount( )返回matcher对象中的group的数目。不包括group0。

public String group( ) 返回上次匹配操作(比方说find( ))的group 0(整个匹配)

public String group(int i)返回上次匹配操作的某个group。如果匹配成功,但是没能找到group,则返回null。

public int start(int group)返回上次匹配所找到的,group的开始位置。

public int end(int group)返回上次匹配所找到的,group的结束位置,最后一个字符的下标加一。

Java正则表达式匹配所有数字+匹配纯数字+匹配带小数点数字相关的知识

用于匹配的正则表达式为 :([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9])

(

[1-9] :匹配1~9的数字;

\\d :匹配数字,包括0~9;

* :紧跟在 \\d 之后,表明可以匹配零个及多个数字;

\\. :匹配小数点;

? :紧跟在 \\. 之后,表明可以匹配零个或一个小数点;

0 :匹配一个数字0;

)
其中的 [1-9]\\d*\\.?\\d* 用以匹配诸如:1、23、34.0、56.78 之类的非负的整数和浮点数;

其中的 0\\.\\d*[1-9] 用以匹配诸如:0.1、0.23、0.405 之类的非负浮点数

 基础知识参考:Java 正则表达式 | 菜鸟教程

https://www.runoob.com/java/java-regular-expressions.html

JAVA 正则表达式 (超详细) - wangxuanyou - 博客园

https://www.cnblogs.com/xyou/p/7427779.html

Java 正则表达式的用法和实例_Lemon-CSDN博客_java 正则表达式

https://blog.csdn.net/weixin_43860260/article/details/91417485

JAVA正则表达式:Pattern类与Matcher类详解(转) - ggjucheng - 博客园

https://www.cnblogs.com/ggjucheng/p/3423731.html

 类似资料: