正则表达式
正则表达式是处理文本的利器。
在做题的时候,用来处理字符串很省事。
总之,很有用。
正则表达式就是用某种模式去匹配字符串的一个公式。
一、使用正则表达式
先放一段代码:
/**
* 反向引用
* 找形如1221,2332这样的字符串
*/
public class fxyinyong {
public static void main(String[] args) {
String str = "3113456789";
String regStr = "(\\d)(\\d)\\2\\1";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(str);
while (matcher.find()){
System.out.println("找到符合规则的字符串:"+matcher.group(0)); //这里输出:3113
System.out.println("找到第一组:"+matcher.group(1));//这里输出:3
System.out.println("找到第二组:"+matcher.group(2));//这里输出:1
}
}
}
在正则表达式中Pattern
类和Matcher
类很重要,经常使用。
java.util.regex.Pattern
类中的常用方法:
- static Pattern compile(String regex) 将给定的正则表达式编译为模式。
- static Pattern compile(String regex, int flags) 将给定的正则表达式编译为带有给定标志的模式。flags参数是一个位掩码,可能包括 CASE_INSENSITIVE , MULTILINE , DOTALL , UNICODE_CASE , CANON_EQ , UNIX_LINES , LITERAL , UNICODE_CHARACTER_CLASS和 COMMENTS标志中的其中一个。
- Matcher matcher(CharSequence input) 创建一个匹配器,匹配给定的输入与此模式。
- String[] split(CharSequence input) 将给定的输入序列分成这个模式的匹配。
- String[] split(CharSequence input, int limit) 将给定的输入序列分成这个模式的匹配。limit参数表示所产生的字符串的最大数量。
java.util.regex.Matcher
类中的常用方法:
- boolean matches() 尝试将整个区域与模式进行匹配。
- boolean find() 尝试查找下一个匹配,找到了就返回true。
- boolean find(int start) 尝试查找下一个匹配,找到了就返回true。
- int start() 返回上一个匹配的起始索引。
- int end() 返回上一个匹配的结束索引。
- boolean lookingAt() 将输入序列从区域开头开始与模式匹配,如果匹配上了就返回true。
- String group() 返回当前的匹配。
- String group(int groupIndex) 返回匹配给定群组的字符串。该群组由从1开始的索引指定的,或者用0表示整个匹配。
- String group(String name) 返回匹配给定群组的字符串。用表示具名群组的字符串来指定。
- String replaceAll(String replacement) 返回从匹配器输入获得将所有匹配用替换字符串替换之后的字符串。
除了这两个常用的类之外,还有java.util.regex.PatternSyntaxException
类,抛出未经检查的异常,用于指示正则表达式模式中的语法错误;我们常用的java.util.Scanner
类中可以使用正则表达式解析原始类型和字符串。
二、正则表达式的语法(常用)
我觉得这篇文章写的挺好:https://blog.youkuaiyun.com/weixin_40608613/article/details/102786878
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
-
在正则表达式中需要使用转义符号的字符有:
. * + - ( ) $ / \ ? [ ] ^ { }
比如查找字符串中的.
符号,则需要对.
进行转义,即在其前加一个 \ 。例如:reg\.ex
匹配 reg.ex
但是当这些符号写在[]
里面的时候就不需要使用转义符了。 -
Java语言是区分大小写的,如果想要使正则表达式中的大小写不敏感,有两种方法:
(1)使用Pattern.CASE_INSENSITIVE标志,用法:Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
表示对所有匹配条件的字符串中的字符大小写不敏感。
(2)使用(?i) ,用法:String regStr = "(?i)abcd";
表示对abcd
的大小写不敏感;String regStr = "((?i)ab)cd";
表示对ab
的大小写不敏感。 -
Java中的匹配模式默认为贪婪匹配,即尽可能的匹配多的。如果想要尽可能匹配少的,可以使用
?
,用法:
String str = "fguiabchfjgk";
String regStr1 = "abc.*"; //匹配到abchfjgk
String regStr1 = "abc.*?"; //匹配到abc
表达式 | 描述 |
---|---|
*? | 重复0次 |
+? | 重复1次 |
?? | 重复0次 |
{n,m}? | 重复n次 |
{n,}? | 重复n次 |
就先这样吧!