正则表达式学习总结 --- Java(一)

正则表达式学习总结 — Java(一)

了解正则表达式
  • 正则表达式是一种强大而灵活的文本处理工具。使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配这些模式的部分,你就能够随心所欲地对它们进行处理。初学正则表达式时,其语法是一个难点,但它确实是一种简洁、动态的语言。正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题:匹配、编辑以及验证

  • 很久之前,正则表达式就已经整合到标准Unix工具集之中,例如sek和awk,以及程序设计语言之中了,例如Python和Perl。而在Java中,字符串操作还主要集中于String、 StringBuffer和StringTokenizer类。与正则表达式相比较,它们只能提供相当简单的功能

Java中的正则表达式
  • 一般来说,正则表达式就是以某种方式来描述字符串,因此你可以说:”如果一个字符串含有这些东西,那么它就是我正在找的东西。” 例如,要找一个数字,它可能有一个负号在最前面,那你就写一个负号加上一个问号:-?

  • 要描述一个整数,你可以说它有一位或多位阿拉伯数字。在正则表达式中,用 \d 表示一位数字。如果在其他语言中使用正则表达式,那你立刻就能发现Java对反斜线 \ 的不同处理。在其他语言中,\\ 表示“我想要在正则表达式中插入一个普通的(字面上的)反斜线,请不要给它任何特殊的含义。” 而在Java中,\\ 的意思是“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的含义。” 例如,如果你想表示一位数字,那么正则表达式应该是 \\d 。如果你想插入一个普通的反斜线,则应该这样 \\\\ 。不过换行和制表符之类的东西只需要使用反斜线:\n \t

  • 要表示“一个或者多个之前的表达式”,应该使用+。所以,如果要表示“可能有一个负号,后面跟着一位或者多位数字”,可以这样:-?\\d+

String类中的正则工具
  • String类中内建了几个正则表达式的工具,它们的功能虽然比较单一,但也经常在实际应用中派上用场,接下来就对String类中的正则表达式工具进行详细说说明

  • Java中的String类内建了正则表达式的功能,利用该类是应用正则表达式的最简单的途径。例如,你可以检查一个String是否匹配一个正则表达式:

public static void main(String[] args) {
    System.out.println("-1234".matches("-?\\d+"));
    System.out.println("5678".matches("-?\\d+"));
    System.out.println("+991".matches("-?\\d+"));
    System.out.println("+991".matches("(-|\\+)?\\d+"));
}
/*
输出:
true
true
false
true
*/
  • 前两个字符串满足对应的正则表达式,匹配成功。第三个字符串开头有一个 + ,它也是一个合法的整数,但与对应的正则表达式却不匹配。因此,我们的正则表达式应该描述为:“可能以一个加号或减号开头”。在正则表达式中,括号有着将表达式分组的效果,而竖线 | 则表示或操作。例如,(-|\+)? 这个正则表达式表示字符串的起始字符可能是一个 - 或者 + ,也可能是二者都没有(因为后面跟着 ? 修饰符)。还有就是,因为字符 + 在正则表达式中有特殊的意义,所以必须使用 \ 将其转义,使之成为表达式中的一个普通字符

  • String类还自带了一个非常有用的正则表达式工具——split()方法,其功能是 “将字符串从正则表达式匹配的地方切开”

public static String knights =
        "Then, when you have found the shrubbery, you must " +
        "cut down the mightiest tree in the forest... " +
        "with... a herring!";

public static void split(String regex) {
    System.out.println(
            Arrays.toString(knights.split(regex))
    );
}

public static void main(String[] args) {
    split(" ");
    split("\\W+");
    split("n\\W+");
}
/*
输出:
[Then,, when, you, have, found, the, shrubbery,, you, must, cut, down, the, mightiest, tree, in, the, forest..., with..., a, herring!]
[Then, when, you, have, found, the, shrubbery, you, must, cut, down, the, mightiest, tree, in, the, forest, with, a, herring]
[The, whe, you have found the shrubbery, you must cut dow, the mightiest tree i, the forest... with... a herring!]
*/
  • 先看主函数中的第一行代码,这里使用普通的字符作为正则表达式,其中并不包括任何特殊的字符。因此第一个 split() 只是按照空格来划分字符串。而在第二个和第三个 split() 中,都使用到了 \\W ,它的意思是非单词字符(如果W变成小写,即\\w,则表示一个单词字符)。观察第二行代码的输出,它将标点字符删掉了。第三个 split() 表示,“字母 n 后面跟着一个或者多个非单词字符”。可以看到,在原始字符中,与正则表达式匹配的部分,在最终结果中都被剔除了

  • String类自带的最后一个正则表达式工具是 “替换” 。你可以只替换正则表达式第一个匹配的子串,或者是替换所有匹配的地方

public static String knights =
        "Then, when you have found the shrubbery, you must " +
        "cut down the mightiest tree in the forest... " +
        "with... a herring!";

public static void main(String[] args) {
    String s = knights;
    System.out.println(s.replaceFirst("f\\w+", "located"));
    System.out.println(s.replaceAll("shrubbery | tree | herring", "banana"));
}
/*
输出:
Then, when you have located the shrubbery, you must cut down the mightiest tree in the forest... with... a herring!
Then, when you have found the shrubbery, you must cut down the mightiestbananain the forest... with... abanana!
*/
  • 第一个表达式要匹配的是,以字母 f 开头,后面跟着一个或者多个字母(注意w是小写的)。并且只替换掉第一个匹配的部分,所以 “found” 被替换成 “located” 。而第二个表达式要匹配的是三个单词中的任何一个,因为它们以竖线 “|” 分割,表示 “或” 操作,并且替换所有匹配的部分
未完待续
  • 到这里就介绍完了正则表达式的大致概念以及String类中有关正则表达式的内建功能,仅仅如此吗? No No No! String之外的正则表达式还有更丰富更强大的工具供你使用,主要就是 java.util.regex 包所提供的正则表达式工具,下一篇博客就开始进入 regex 包~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JiangNanMax

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值