Java(60):Java 正则表达式
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时,才可以使用.
.*name.* 用于查找字符串中是否包了name 子串
String pattern = ".*name.*"; String content = "my name is ${name}"; boolean flag = Pattern.matches(pattern, content); System.out.println(flag);
打印:true
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
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获取后,再打印。
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 --->匹配(.*?)里的值。
备注:
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的结束位置,最后一个字符的下标加一。
用于匹配的正则表达式为 :([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 - 博客园