正则表达式(一)

本文介绍了正则表达式的基本概念及其在Java中的应用。详细解释了如何在Java中使用正则表达式进行字符串匹配,并提供了实例代码。适用于希望提高文本处理能力的Java开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文并非全部原创,我只是在前人的基础上进行针对Java的补充和完成。特此向各位前辈致敬。本文来源于以下内容:

什么是正则表达式

正则表达式(英文:Regular Expression)在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。“正则表达式”通常缩写成“regex”。

在现实工作场景中,正则表达式常被用于进行输入验证、内容检索、字符串替换等工作。个人认为正则表达式应该算程序员的必修课之一,由于它应用的非常之广泛,而且在各种语言基本上都可以使用,更重要的是在 Linux 或 Unix 系统下能灵活使用正则表达式也可大大提高工作效率,所以学习它是非常保值的。

正则表达式与正则表达式引擎

直观而言正则表达式是一段负责正则表达式语法的字符串,而负责处理这段表达式的程序,就是正则表达式引擎。表达式引擎由语言或环境提供,作为开发者并不直接面对它。我们只需要编写表达式,然后交给表达式引擎进行处理就可以了。不同语言或环境会以不同方式为我们使用正则表达式提供支持,就拿Java语言来说,我们可以在 String.replaceAll() / String.split() / String.matches() 上直接使用正则表达式,又或者通过 java.util.regex 包中提供的类来使用正则表达式。

不同环境的正则表达式写法与支持或多或少会有一些差别,不过这你可以完全不需要当心,因为这并不影响你使用正则表达式,近代的表达式引擎都非常类似。Perl 5 类型的引擎应该算应用最为广泛的引擎。如果你想了解各种风格的引擎的语法支持,可以参考《Regexp Syntax Summary》。

表达式与符号

让我们从一个最简单的程序(Java)开始说起:

   1: String string = "gooooooogle";
   2: String regex = "go*gle";
   3: System.out.println(string.matches(regex));

这个段代码运行的话,将会在控制台输出“true”。它是说字符串 string 与正则表达式 regex 匹配,换句话说,就是字符串 string 符合正则表达式 regex 所描述的模式。在该例子中,最起码我们可以知道正则表达式的操作对象是字符串,而正则表达式也是一个字符串。字符串又是由字符所构成的,在表达式 go*gle 中 g,o,l,e 是文字字符而 * 是数量限定字符,它代表前面的字符可以不出现,也可以出现一次或者多次。

文字字符

最基本的正则表达式由单个文字符号组成。如 a ,它将匹配字符串中第一次出现的字符“a”。如对字符串“Jack is a boy”。“J”后的“a”将被匹配。而第二个“a”将不会被匹配。正则表达式也可以匹配第二个“a”,这必须是你告诉正则表达式引擎从第一次匹配的地方开始搜索。在文本编辑器中,你可以使用“查找下一个”。如果变成 Java 代码的话就是这样:

   1: String string = "Jack is a boy";
   2: // 将字符串编译为正则表达式的对象表示形式
   3: Pattern pattern = Pattern.compile("a");
   4: // 创建对字符串 string 根据正则表达式 pattern 进行匹配操作的匹配器对象
   5: Matcher matcher = pattern.matcher(string);
   6: // 查找下一个匹配的字符串内容,如果找到返回 true,找不到返回 false
   7: while(matcher.find()) {
   8:     // 输出捕获到的匹配内容
   9:     System.out.print(matcher.group() + "/t");
  10: }

类似的,cat 会匹配“About cats and dogs”中的“cat”。这等于是告诉正则表达式引擎,找到一个c,紧跟一个a,再跟一个t。要注意,正则表达式引擎缺省是大小写敏感的。除非你告诉引擎忽略大小写,否则 cat 不会匹配“Cat”,就像下面这样。(除了这种方法,还可以在表达式内声明什么内容需要区分大小写什么不需要,这在后面会有介绍)

   1: String string = "About Cats and dogs";
   2: // 在编译表达式时使用标记 CASE_INSENSITIVE,使表达式忽略大小写
   3: Pattern pattern = Pattern.compile("cat", Pattern.CASE_INSENSITIVE);
   4: Matcher matcher = pattern.matcher(string);
   5: while(matcher.find()) {
   6:     System.out.print(matcher.group() + "/t");
   7: }

特殊字符

对于文字字符,有11个字符被保留作特殊用途。他们是:[ ] / ^ $ . | ? * + ( ) 这些特殊字符也被称作元字符。 如果你想在正则表达式中将这些字符用作文本字符,你需要用反斜杠“/”对其进行换码 (escape)。例如你想匹配“1+1=2”,正确的表达式为 1/+1=2 。需要注意的是,1+1=2 也是有效的正则表达式。但它不会匹配“1+1=2”,而会匹配“123+111=234”中的“111=2”。因为“+”在这里表示特殊含义(重复1次到多次)。

不可显示字符

可以使用特殊字符序列来代表某些不可显示字符:
/t 代表Tab(0x09)
/r 代表回车符(0x0D)
/n 代表换行符(0x0A)
要注意的是Windows中文本文件使用“/r/n”来结束一行而Unix使用“/n”。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值