标签:Java String 正则表达式 matcher Pattern println out
Java正则表达式
前言
这几天做几道算法题时,考虑到用正则表达式解决。由于对正则表达式掌握不是很好,特此查找了一些学习教程并作出如下笔记,有不对的地方或者缺少知识点的地方,希望各位大佬在下方给出见解。那么下面就开始我们学习的步伐吧!
正则表达式简介
百度百科:正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
个人理解:所谓正则表达式就是在一定的规则下,通过特定的符号组成一个逻辑公式,该逻辑公式也相当于一个过滤器来获取符合该逻辑公式规则的字符串。
试试水(小例)
下面举出几个简单的正则表达式,让大家了解一下其实正则表达式很简单,不必为其各种各样的字符和各种各样长长的讲解而烦恼。
正则表达式 | 解释 |
---|---|
Hello World | 最简单的正则表达式(正则表达式其实就是一个字符串),该正则表达式只能滤取“Hello World”。 |
a.b* | .该点表示匹配任意一个字符,表示匹配前一字符b出现0次或者多次。例如acbb,adb等与a.b匹配 。 |
^a\d+ | ^表示以什么开始,这里便是以字符a开始。\d+表示匹配一个或者多个数字。 |
以上便是几个简单例子,大家或许会问:“我知道了怎么写表达式,那怎么用呢?”,下面我就为怎么用,简单的介绍一下java的java.util.regex包下的类。
regex包下类
java.util.regex包主要包括如下三个类:
类 | 解释 |
---|---|
Pattern 类 | 没有构造方法,主要用于编译表示实例 。 |
Matcher 类 | 没有构造方法,主要用于判断对输入字符串是否与正则表达式匹配。 |
PatternSyntaxException | 表示正则表达式的语法错误 。 |
Pattern 类的方法
以下挑选几个主要的方法进行介绍,其他几个方法请大家自行查看源码。
- 编译方法:主要用于编译实例,创建Pattern对象和Matcher对象。
序号 | 方法及解释说明 |
---|---|
1 | public static Pattern compile(String regex) ,返回 Pattern对象。 |
2 | public static Pattern compile(String regex, int flags),返回Pattern对象。flags主要用于调整匹配行为。 |
3 | public Matcher matcher(CharSequence input),返回Matcher对象。 |
- spilt的方法:切割字符串(与String中的spilt方法类似)
序号 | 方法及解释 |
---|---|
1 | public String[] split(CharSequence input),返回切割后的字符串。 |
2 | public String[] split(CharSequence input, int limit) |
- quote的方法:将正则表达式失去其原本作用,仅仅作为普通字符。
序号 | 方法及解释 |
---|---|
1 | public static String quote(String s) ,返回失效后的字符串。 |
Matcher 类的方法
在介绍Matcher类的方法前先介绍一下捕获组,以下便是捕获组的相关知识点:
- 捕获组:将多个字符作为一个单独的单元进行处理。通过从左至右计算其开括号来编号。
下边便举一个简单的例子:
从上图可以看出我们分组有四个,但是还包括最后一个捕获组((A)(B( C )),代表整个表达式。好的例子总会伴随着代码,如下便是代码例子,一些注意事项,也会一一标明。
public class RegexMacher_Text {
public static void main(String[] args) {
String line="My name is Lveson 380! ok!";
/**
* \\D表示非数字字符的任意字符
* \\d表示数字字符
*/
String pattern="(\\D*)(\\d+)(.*)";
Pattern r=Pattern.compile(pattern);
Matcher matcher=r.matcher(line);
/**
* public int groupCount() {
* return parentPattern.capturingGroupCount - 1;
* }
* 当中的-1是减去group(0)
*/
System.out.println(matcher.groupCount());
while (matcher.find()){
System.out.println("Value:"+matcher.group(0));
System.out.println("Value:"+matcher.group(1));
System.out.println("Value:"+matcher.group(2));
System.out.println("Value:"+matcher.group(3));
}
}
}
- 索引方法:确定从哪个字符开始匹配。
序号 | 方法及解释 |
---|---|
1 | public int start(),默认从头开始也就是0。 |
2 | public int start(int group),group是指使用group捕获组开始匹配的字符串从第几个字符开始。 |
3 | public int end(),默认在哪个位置结束。 |
4 | public int end(int group),与start(group)相反。 |
代码示例:
public class RegexMacher_Text {
public static void main(String[] args) {
String line="My name is Lveson 380! ok!";
/**
* \\D表示非数字字符的任意字符
* \\d表示数字字符
*/
String pattern="(\\D*)(\\d+)(.*)";
Pattern r=Pattern.compile(pattern);
Matcher matcher=r.matcher(line);
/**
*这里解释一下start()和end()方法为何放在if(matcher.find()){}中
*因为Matcher类中有一个first参数,上述两种方法若想返回正常数值first必须要符合一定的条件。我们打开Master
*源码来观察一下find()方法返回的是return search(nextSearchIndex);找到search()方法会发现有一句语段
*this.first = from;以上便是start()和end()方法放在if(matcher.find()){}中的原因。
*/
if (matcher.find()){
System.out.println(matcher.start(3));
System.out.println(matcher.end(3));
}
}
}
- 查找方法:检查输入的字符串是否与正则表达式相匹配。
序号 | 方法及解释 |
---|---|
1 | public boolean lookingAt() ,表示从字符串开头开始与正则表达式匹配,但不需要整个区域进行匹配。 |
2 | public boolean find(),查找与正则表达式匹配的输入序列的下一个子序列。在捕获组上有所应用。 |
3 | public boolean find(int start),与上一个find()相似,只不过是从指定的start索引位置开始。 |
4 | public boolean matches(),整个区域与正则表达式进行匹配。 |
代码示例1:
public class RegexMacher_Text2 {
//lookingAt()和matcher()两方法对比
public static void main(String[] args) {
String regex="Lveson";
String input1="Lvesonson";
String input2="sonLvesonson";
String input3="Lveson";
Pattern p=Pattern.compile(regex);
Matcher matcher1=p.matcher(input1);
Matcher matcher2=p.matcher(input2);
Matcher matcher3=p.matcher(input3);
//matcher1
System.out.println("matcher1的lookingAt方法结果"+matcher1.lookingAt());
System.out.println("matcher1的matcher方法结果"+matcher1.matches());
//matcher2
System.out.println("matcher2的lookingAt方法结果"+matcher2.lookingAt());
System.out.println("matcher2的matcher方法结果"+matcher2.matches());
//matcher3
System.out.println("matcher3的lookingAt方法结果"+matcher3.lookingAt());
System.out.println("matcher3的matcher方法结果"+matcher3.matches());
}
}
代码示例2:
public class RegexMacher_Text3 {
public static void main(String[] args) {
String line="LvvesonLvvesonLvvesonLvvesonLvveson";
int j=1;
String pattern="(Lv*e)(son)";
Pattern r=Pattern.compile(pattern);
Matcher matcher=r.matcher(line);
while (matcher.find()){
System.out.println("所有捕获组第"+j+"序列:"+matcher.end());
System.out.println("第一个捕获组Lv*e:"+matcher.end(1));
System.out.println("第二个捕获组son:"+matcher.end(2));
j++;
}
}
}
- 替换方法
序号 | 方法及解释 |
---|---|
1 | public static String quoteReplacement(String s) |
2 | public Matcher appendReplacement(StringBuffer sb, String replacement),实现非终端添加和替换步骤。 |
3 | public StringBuffer appendTail(StringBuffer sb),实现终端添加和替换步骤。 |
4 | public String replaceAll(String replacement),替换字符串与给定字符串相匹配的输入序列的每个子序列。 |
5 | public String replaceFirst(String replacement),替换字符串与给定字符串相匹配的输入序列的第一个子序列 |
代码示例:
public class RegexMacher_Text4 {
public static void main(String[] args) {
String regex="dog";
String input="This is a dog,There are some dogs.";
String replace="cat";
Pattern p=Pattern.compile(regex);
Matcher matcher=p.matcher(input);
String input1=matcher.replaceAll(replace);
System.out.println("replaceAll:"+input1);
String input2=matcher.replaceFirst(replace);
System.out.println("replaceFirst:"+input2);
}
}
PatternSyntaxException类的方法
序号 | 方法及解释 |
---|---|
1 | public int getIndex(),获取错误的描述。 |
2 | public String getDescription(),获取错误的索引。 |
3 | public String getPattern(),获取错误的正则表达式模式 |
4 | public String getMessage(),返回多行字符串,包含语法错误及其索引的描述、错误的正则表达式模式和模式中错误索引的可视化指示。 |
正则表达式语法
正则表达式语法中的一些符号作用,这里不在详细描述,请大家详细参考菜鸟教程,链接:https://www.runoob.com/java/java-regular-expressions.html。
尾语
以上便是编者本人的学习总结,若有不足的地方请各位大佬指出。如若写得好请给个赞,谢谢各位!大家一起学习进步。
标签:Java,String,正则表达式,matcher,Pattern,println,out 来源: https://blog.csdn.net/weixin_40741512/article/details/112758800
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。