经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 正则表达式 » 查看文章
Java正则相关的Pattern和Matcher类及遇到的坑
来源:jb51  时间:2019/9/10 10:26:35  对本文有异议

此篇文章是记录我在学习Java正则表达式时候学到的和遇到的坑。

先来说说 Matcher 里面的三个方法(取的结果以group()方法为例子)

  • matches():整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回False。但如果前部分匹配成功,将移动下次匹配的位置。举个例子如果字符串为"a123",正则表达式为"\w\d\d\d",则matches()方法才返回true,换言之,就是要匹配的字符串需要跟正则表达式一一对应,字母对应字母,数字对应数字,所以称之为完全匹配,错一位都不行。(这里的理解花了我好长时间,网上搜到的都没有提及,也许是我理解能力不够)
  • find():部分匹配,从当前位置开始匹配,找到一个匹配的子串,将移动下次匹配的位置。“find()像迭代器那样向前遍历输入字符串。” --摘自《Java编程思想。看下面的例子中的find()方法,要匹配的字符串为"a123b",正则表达式为"\d\d\d",而最后输出结果为:123,所以称之为部分匹配,只要有,就返回true。
  • lookingAt():部分匹配,总是从第一个字符进行匹配,匹配成功了不再继续匹配,匹配失败了,也不继续匹配。lookingAt()方法介于matches()和find()方法之间。lookingAt()方法的部分匹配指从第一位开始匹配如果第一位没有匹配到,就不再匹配,直接返回false,如果第一位匹配到了,则匹配第二位,以此类推。例子:要匹配的字符串为"a123b",正则表达式为"\w\d\d",输出结果为"a12",很好理解,就是一位一位地匹配,匹配到了就匹配下一位。"\w\d\d"这个正则正好代表"字母数字数字",所以正好输出结果为a12。

好了上测试代码:

  1. package com.wjj.utils;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. /**
  5. * @author 作者 : 榨菜哥
  6. * @version 创建时间:2016年8月18日 上午8:47:58
  7. * 类说明:正则表达式的练习
  8. */
  9. public class Regex {
  10. //find方法测试
  11. public static void find(String html) {
  12. String regex = "\\d\\d\\d";
  13. Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
  14. Matcher matcher = pattern.matcher(html);
  15. System.out.print("find():");
  16. if (matcher.find()) {
  17. System.out.println(matcher.group());
  18. }
  19. }
  20. //matches方法测试
  21. public static void matches(String html) {
  22. String regex = "^\\w\\d\\d\\d";
  23. Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
  24. Matcher matcher = pattern.matcher(html);
  25. System.out.print("matches():");
  26. if (matcher.matches()) {
  27. System.out.println(matcher.group());
  28. }
  29. }
  30. //lookingAt方法测试
  31. public static void lookingAt(String html) {
  32. String regex = "\\w\\d\\d";
  33. Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
  34. Matcher matcher = pattern.matcher(html);
  35. System.out.print("lookingAt():");
  36. if (matcher.lookingAt()) {
  37. System.out.println(matcher.group());
  38. }
  39. }
  40. public static void main(String[] args) {
  41. //find方法测试
  42. find("a123b");
  43. //matches方法测试
  44. matches("a123");
  45. //lookingAt方法测试
  46. lookingAt("a123b");
  47. }
  48. }

输出结果:

    find():123
    matches():a123
    lookingAt():a12

小结:正则表达式本身并不难,平常使用的时候只要按照规则来写就好了。在学习中理解matches、find、和lookingAt三个方法花了我比较长的时间,一直不能理解完全匹配和部分匹配是什么意思,最后还是在stackoverflow上找到了想要的答案。

以上是个人学习的理解,有不对之处,希望给予指点。

(补充:正则表达式Pattern如果调用多次容易出问题,比如内存溢出,因为Pattern每执行一次就编译一次正则表达式,因此建议将需要的正则表达式进行预编译。)

正则表达式学习教程: http://deerchao.net/tutorials/regex/regex.htm ,文中作者写得挺详细的,并且通俗易懂。

总结

以上所述是小编给大家介绍的Java正则相关的Pattern和Matcher类及遇到的坑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对w3xue网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号