一文搞懂Java正则表达式_世界今日讯
如果我们想根据特定的模式表示一组字符串,那么我们应该使用正则表达式。
例如,我们可以编写一个正则表达式来表示所有有效的电子邮件地址,或者我们可以编写一个正则表达式来验证有效的电话号码等。
【资料图】
使用正则表达式的最重要的应用领域是:
开发验证框架,如Hibernate Validator。开发模式匹配工具或应用程序,如Linux中的Ctrl+F或grap cmd。开发数字电路开发翻译器,如汇编器、编译器和解释器等。开发通信协议TCP/IP、UDP等。要在Java中使用正则表达式,我们可以利用java.util.regex包,该包包括以下类:
Pattern——这个类是一组可以用于定义各种类型模式的正则表达式的编译(定义在搜索中使用的模式)。Matcher——这个对象用于在Java中执行匹配操作,用于在输入字符串中搜索模式。PatternSyntaxException——这个类用于指示正则表达式模式中的语法错误。这里是一个正则表达式的示例代码片段:
import java.util.regex.*;public class RegularExpression { public static void main(String[] args) { int count = 0; Pattern pattern = Pattern.compile("ab"); Matcher matcher = pattern.matcher("abcbcbcababacb"); while (matcher.find()) { ++count; System.out.println(matcher.group()+ "...... found at: "+matcher.start()); } System.out.println("The Total number of occurrence is " + count); }}/**** Output- ab...... found at: 0 ab...... found at: 7 ab...... found at: 9 The Total number of occurrence is 3****/
2 PatternPattern是一个已编译的正则表达式,即Java中的模式等价物。我们可以使用Pattern类的compile()方法创建一个模式对象。Pattern类的compile()方法的签名如下:
Flags——compile()方法中的标志会改变搜索的方式。以下是其中几个:
CASE_INSENSITIVE——在执行搜索时将忽略字母的大小写。UNICODE_CASE——与CASE_INSENSITIVE标志一起使用,它会忽略英语字母以外的字母的大小写。LITERAL——使用时,模式中的特殊字符将不具有任何特殊含义,在执行搜索时只被视为普通字符。public static Pattern compile(String regex)
以下是Pattern类compile()方法的一个示例:
Pattern pattern = Pattern.compile("ab");
3 Matchermatcher对象可用于检查目标字符串中的指定模式。使用Pattern类的matcher()方法,我们可以生成一个匹配器对象。Pattern类的matcher()方法具有以下签名:
public Matcher matcher(CharSequence input)
以下是Pattern类matcher()方法的示例:
Matcher matcher = pattern.matcher("abcbcbcababacb");
Matcher类存在于java.util.regex包中。以下是Matcher类一些最重要的方法:
boolean find()——这个方法尝试查找下一个匹配项,在找到匹配项时返回true,否则返回false。int start()——这个方法返回匹配项在输入字符串中的起始索引。int end()——这个方法返回匹配项在输入字符串中的结束索引。String group()——这个方法返回匹配的模式。注意:Pattern和Matcher类存在于java.util.regex包中,从java1.4v开始引入。
4 字符类[abc]——要么是"a"、"b"或"c"[^abc]——除了"a"、"b"和"c"[a-z]——任何从a到z的小写字母符号[A-Z]——任何从A到Z的大写字母符号[a-zA-Z]——任何字母符号[0–9]——任何0到9的数字[a-zA-Z0–9]——任何字母数字符号[^a-zA-Z0–9]——除了字母数字符号(仅限特殊字符)5 预定义字符类.——除换行符外的任何字符\d——数字(0-9)\D——非数字(0-9)\w——单词字符(a-z、A-Z、0-9、_)\W——非单词字符\s——空格(空格、制表符、换行符)\S——非空格(空格、制表符、换行符)\b——单词边界\B——非单词边界\uxxxx——由十六进制数xxxx指定的Unicode字符6 量词符*——0次或多次+——1次或多次?——0次或1次{3}——精确数量3次{3,4}——数字范围(最小值,最大值)我们可以使用量词符指定要匹配的出现次数。
Pattern类的split()方法要根据特定的模式拆分目标字符串,我们可以使用Pattern类的split()方法。Pattern类的split()方法具有以下签名:
public String[] split(CharSequence input)
为了方便,我在这里包含了Pattern类split()方法的代码片段:
public class RegularExpression { public static void main(String[] args) { Pattern pattern = Pattern.compile("\\s"); String[] splitString = pattern.split("Pattern class is present in java.util.regex"); for (String text : splitString) { System.out.println(text); } }}/*** Output - Pattern class is present in java.util.regex***/
在上面的示例中,根据空格(\s)分割了字符串。
String类的split()方法String类也包含split()方法。字符串类的split()方法用于根据特定模式拆分目标字符串。
public class RegularExpression { public static void main(String[] args) { String text = "This is example of String class split() method"; String[] strings = text.split("\\s"); for (String s : strings) { System.out.println(s); } }}/***Output This is example of String class split() method***/
在上面的例子中,字符串是根据空白(\s)来划分的。
注意:Pattern类的split()方法可以接受一个目标字符串作为参数,而String类的split()方法可以接受一个正则表达式作为参数。
7 StringTokenizerStringTokenizer是专门用于标记化任务的类。Java.util包中有一个StringTokenizer类。
public class StringTokenizerDemo { public static void main(String[] args) { StringTokenizer tokenizer = new StringTokenizer("StringTokenizer class present in java.util package"); while (tokenizer.hasMoreTokens()) { System.out.println(tokenizer.nextToken()); } }}/*** Output - StringTokenizer class present in java.util package***/
注意:StringTokenizer的默认正则表达式为空格符(\s)。
我们也可以根据需要传递正则表达式,以下是代码片段有助于你更好地理解:
StringTokenizer tokenizer = new StringTokenizer("05-21-2023","-");while (tokenizer.hasMoreTokens()) { System.out.println(tokenizer.nextToken());}/*** Output 05 21 2023***/
我列了一些常用的编程正则表达式: