前言
正则表达式是一种强大而灵活的文本处理工具。通过正则表达式,我们能够以编程的方式,构建复杂的文本模式,对输入的字符串进行搜索。一旦找到匹配的部分,我们就能随心所欲的对它们进行处理。
初学正则表达式时,它的语法是对初学者的一门考验,只有琢磨透了其真正的内涵,我们才能从本质上看到它确实是一种简洁、动态的语言。
万事开头难嘛
正则表达式不像我们平常看到的那么简单,它,真的很变态。通过复杂的文本模式而处理我们遇到的所有问题,这本身就很不可思议。首先看个简单的栗子,看看它神奇的魅力:
输出结果如下:
我们首先看到方法里的表达式一脸懵逼吧,很正常,因为我第一次看到时也是。究竟这些表示什么含义呢?
首先这里要先普及一个小知识点,在其他语言中,表示我想要在正则表达式中插入一个普通的反斜杠,请不要给它任何特殊的意义,而在Java中,表示我要插入一个正则表达式的反斜杠,所以其后的字符具有特殊的意义。也就是说,在Java里,只有才表示转义,不同于其他语言就能代表转义。
现在回到上面的这个栗子里来,表示的含义是可能有一个负号,后面紧跟着一个或多个数字,这听起来不就描述的是了吗。后面三个输出含义同上,不同的是,最后一个使用到了,它的含义是可能有一个负号或正好,后面紧跟着一个或多个数字。需要注意的是由于在正则表达式中有特殊的含义,因此这里需要对其进行转义。
正则表达式语法
除了上面出现过的正则表达式以外,还有大量的语法:
我们学习正则表达式并不是为了编写出最难理解的正则表达式,而是尽量编写能够完成任务的、最简单以及最必要的正则表达式。一旦真正开始使用正则表达式了,你就会发现,在编写新的表达式之前,你通常会参考代码中已经用到的正则表达式(引用自Thinking in Java)。
Pattern 和 Matcher
一般来说,比起功能有限的String类,我们更愿意构造功能强大的正则表达式对象。只需要导入包,然后用方法来编译正则表达式即可。它会根据编译传入的参数(类型的正则表达式)生成一个对象。接着把需要检索的字符串传入对象的方法。该方法会生成一个对象,该对象有许多方法可用。
代码解析:
输出结果如下:
从这里栗子中我们可以看出当调用传入我们的正则表达式作为参数,会返回一个对象,通过调用该对象的方法并传入我们需要匹配的字符串后,从而构造了一个对象。
上面我们用到了对象的find()、group()、start()、end()、matches()、lookingAt()等方法。其中方法可用于在代码中的变量中查找多个匹配,该方法就像迭代器那样前向遍历该字符串。若调用该方法传入一个int类型参数,如,表示从该参数位置作为搜索的起点开始匹配。其中返回整个匹配的值。
matches()方法用来判断整个输入字符串是否匹配正则表达式模式,而lookingAt()则用来判断该字符串从开始部分能否匹配正则表达式模式。
组
组是用括号划分的正则表达式。组号为0表示整个表达式,组号1表示被第一对括号括起来的组,依次类推。
如正则表达式。其中有三个组:组0是ABCD,组1是BC,组2是C。
我们可以通过获得与组相关的信息,返回的是第0组,因此从上面代码中可以看出第0组输出的就是我们的正则表达式。
替换操作
正则表达式特别便于替换文本。它也提供了许多方法:
以第一个参数字符串替换掉第一个匹配成功的部分为第二个参数。
以第一个参数字符串替换所有匹配成功的部分为第二个参数。
执行渐进式的替换,将被匹配的字符串从头一直到匹配处的字符存入的变量中,该方法只会处理到最后一个匹配的字符串。通过该方法允许我们在使用的过程中调用其他方法来生成我们最终想要的处理结果。
可用于在执行了一次或多次方法后,调用此方法可将输入字符串剩下的部分复制到中。
还是需要栗子才能懂得更彻底点:
输出结果显示:
其中我们使用方法替换了字符串中的所有小写字母m,并将它转换成大写后写入stringBuffer中。
最后
正则表达式能够为我们构建复杂的文本模式解决大量问题,但是有时候使用复杂的正则表达式返回会降低我们程序的性能,这里我只是使用了简单的正则表达式来说明其中方法的使用。在过去,Java对于字符串操作的支持相当不完善,不过随着近几个版本的升级,我们可以看到,Java已经从其他语言中吸取了许多成熟的经验,现在,它对字符串操作的支持已经很完善了。
领取专属 10元无门槛券
私享最新 技术干货