java正则使用

举报
小傅哥 发表于 2021/04/30 02:43:56 2021/04/30
【摘要】 //汉字范围u4E00-u9FA5 import java.util.regex.Matcher;import java.util.regex.Pattern; /*********************** * create by fzw 本人网站:www.itstack.org * 2013年11月19日 * 正则的使用 ***********************...

  
  1. //汉字范围u4E00-u9FA5
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. /***********************
  5. * create by fzw 本人网站:www.itstack.org
  6. * 2013年11月19日
  7. * 正则的使用
  8. ************************/
  9. public class sxtRegex01 {
  10. public static void main(String[] args) {
  11. p("检查是否匹配:"+"abc".matches("..."));
  12. p("替换字符串:"+"abc123aa".replaceAll("\\d", "."));
  13. Pattern p = Pattern.compile("[a-z]{3}");
  14. Matcher m = p.matcher("fgha");
  15. p("Pattern+Matcher方法验证匹配:"+m.matches());
  16. p("------------------");
  17. p("a".matches("[abc]"));
  18. p("a".matches("[^abc]"));
  19. p("A".matches("[a-zA-Z]"));
  20. p("A".matches("[a-z]|[A-Z]"));
  21. p("A".matches("[a-z(A-Z)]"));
  22. p("R".matches("[A-Z&&(RFG)]"));
  23. p("------------------");
  24. p("a_8".matches("\\w{3}"));
  25. p("\\".matches("\\\\"));
  26. p("------------------");
  27. p("hello sir".matches("h.*"));
  28. p("hello sir".matches(".*ir$"));
  29. p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));//匹配单词边界,单词边界是空格出现的位置用\\b匹配
  30. p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
  31. p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));//开头是一个空格,且不能是换行符,最后必须是换行
  32. p("------------------");
  33. Pattern p2 = Pattern.compile("\\d{3,5}");
  34. String s = "123-4536-89789-000";
  35. Matcher m2 = p2.matcher(s);
  36. p(m2.matches());
  37. m2.reset();//把吃进去的字符吐出来重新匹配,否经过m2.matches会吃进去字符 下面的匹配就不成功
  38. p(m2.find());
  39. p(m2.start()+"-"+m2.end());//找到了 就把首位位置打印下(必须找到才能打印)
  40. p(m2.find());
  41. p(m2.start()+"-"+m2.end());
  42. p(m2.find());
  43. p(m2.start()+"-"+m2.end());
  44. p(m2.find());
  45. p(m2.lookingAt());//每次都是才头上开始找
  46. p("------------------");
  47. Pattern p3 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//加属性后,Patter.CASE_INSENSITIVE表示大小写不管
  48. Matcher m3 = p3.matcher("java_Java_jAva_jAVa_IloveJava");
  49. p(m3.replaceAll("JAVA"));//把所有的都替换为大写的
  50. p("------------------按照单双数替换");
  51. Pattern p4 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//加属性后,Patter.CASE_INSENSITIVE表示大小写不管
  52. Matcher m4 = p4.matcher("java_Java_jAva_jAVa_IloveJava fdasfas");
  53. StringBuffer sb = new StringBuffer();
  54. int i = 0;
  55. while(m4.find()){
  56. i ++;
  57. if(i%2 == 0){
  58. m4.appendReplacement(sb, "java");
  59. }else{
  60. m4.appendReplacement(sb, "JAVA");
  61. }
  62. }
  63. m4.appendTail(sb);//把尾巴在再添加到buf上既是sb
  64. p(sb);
  65. p("------------------分组加括号只取数字一组");
  66. Pattern p5 = Pattern.compile("(\\d{3,5})([a-z]{2})");
  67. Matcher m5 = p5.matcher("123bb_78987dd_090po");
  68. while(m5.find()){
  69. p(m5.group(1));//grop括号里面第0组是整体,第一组是左起第一个括号,第二组是左起第二个括号
  70. }
  71. p("------------------贪婪的匹配与不贪婪匹配");
  72. Pattern p6 = Pattern.compile("(.{3,10}?)[0-9]");//.{3,10}后面没问号就是贪婪匹配会陪到最长,如果{3,10}?加?号就是懒蛋匹配之匹配最少的,从3个开始找
  73. Matcher m6 = p6.matcher("aaaa5dddd8");
  74. while(m6.find()){//如果这里用if(m6.find)(){p(m6.start()+"-"+m6.end());} 那么之匹配第一个
  75. p(m6.start()+"-"+m6.end());
  76. }
  77. p("------------------普通捕获");
  78. Pattern p7 = Pattern.compile(".{3}");
  79. Matcher m7 = p7.matcher("ab4dd5");
  80. while(m7.find()){
  81. p(m7.group());
  82. }
  83. p("------------------非捕获组");
  84. Pattern p8 = Pattern.compile(".{3}(?=a)");//(?=a)这个是非捕获组的意思,最后一个是a而且还不把这个a取出来!!(?=a)这个要是写在前面 就不一样了
  85. Matcher m8 = p8.matcher("ab4add5");
  86. while(m8.find()){
  87. p("后面不能是a的"+m8.group());
  88. }
  89. p8 = Pattern.compile("(?!a).{3}");//(?!a)前面不能是a的
  90. m8 = p8.matcher("abbsab89");
  91. while(m8.find()){
  92. p("前面不能是a的"+m8.group());
  93. }
  94. //(?<!a)从后往前数 不是a的
  95. //(?<=a)从后往前数 是a的
  96. p("------------------去除><号匹配");
  97. Pattern p9 = Pattern.compile("(?!>).+(?=<)");
  98. Matcher m9 = p9.matcher(">编程中国<");
  99. while(m9.find()){
  100. p(m9.group());
  101. }
  102. p("------------------向前引用");
  103. Pattern p10 = Pattern.compile("(\\d\\d)\\1");//这里面的1是向前引用,12是第一匹配到的,下一次在匹配出来12和前面相同 所以是true
  104. Matcher m10 = p10.matcher("1212");
  105. p(m10.matches());
  106. p("------------------忽略大小写,正则内嵌");//(?i)非捕获组里面这个表示忽略大小写
  107. p("java".matches("(?i)JAVA"));
  108. }
  109. public static void p(Object o){
  110. System.out.println(o);
  111. }
  112. }



--- 正则常用符



  
  1. 字符
  2. x 字符 x
  3. \\ 反斜线字符
  4. \0n 带有八进制值 0 的字符 n (0 <= n <= 7)
  5. \0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
  6. \0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 30 <= n <= 7
  7. \xhh 带有十六进制值 0x 的字符 hh
  8. \uhhhh 带有十六进制值 0x 的字符 hhhh
  9. \t 制表符 ('\u0009')
  10. \n 新行(换行)符 ('\u000A')
  11. \r 回车符 ('\u000D')
  12. \f 换页符 ('\u000C')
  13. \a 报警 (bell) 符 ('\u0007')
  14. \e 转义符 ('\u001B')
  15. \cx 对应于 x 的控制符
  16. 字符类
  17. [abc] a、b 或 c(简单类)
  18. [^abc] 任何字符,除了 a、b 或 c(否定)
  19. [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
  20. [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
  21. [a-z&&[def]] d、e 或 f(交集)
  22. [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
  23. [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
  24. 预定义字符类
  25. . 任何字符(与行结束符可能匹配也可能不匹配)
  26. \d 数字:[0-9]
  27. \D 非数字: [^0-9]
  28. \s 空白字符:[ \t\n\x0B\f\r]
  29. \S 非空白字符:[^\s]
  30. \w 单词字符:[a-zA-Z_0-9]
  31. \W 非单词字符:[^\w]
  32. POSIX 字符类(仅 US-ASCII)
  33. \p{Lower} 小写字母字符:[a-z]
  34. \p{Upper} 大写字母字符:[A-Z]
  35. \p{ASCII} 所有 ASCII:[\x00-\x7F]
  36. \p{Alpha} 字母字符:[\p{Lower}\p{Upper}]
  37. \p{Digit} 十进制数字:[0-9]
  38. \p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}]
  39. \p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
  40. \p{Graph} 可见字符:[\p{Alnum}\p{Punct}]
  41. \p{Print} 可打印字符:[\p{Graph}\x20]
  42. \p{Blank} 空格或制表符:[ \t]
  43. \p{Cntrl} 控制字符:[\x00-\x1F\x7F]
  44. \p{XDigit} 十六进制数字:[0-9a-fA-F]
  45. \p{Space} 空白字符:[ \t\n\x0B\f\r]
  46. java.lang.Character 类(简单的 java 字符类型)
  47. \p{javaLowerCase} 等效于 java.lang.Character.isLowerCase()
  48. \p{javaUpperCase} 等效于 java.lang.Character.isUpperCase()
  49. \p{javaWhitespace} 等效于 java.lang.Character.isWhitespace()
  50. \p{javaMirrored} 等效于 java.lang.Character.isMirrored()
  51. Unicode 块和类别的类
  52. \p{InGreek} Greek 块(简单块)中的字符
  53. \p{Lu} 大写字母(简单类别)
  54. \p{Sc} 货币符号
  55. \P{InGreek} 所有字符,Greek 块中的除外(否定)
  56. [\p{L}&&[^\p{Lu}]] 所有字母,大写字母除外(减去)
  57. 边界匹配器
  58. ^ 行的开头
  59. $ 行的结尾
  60. \b 单词边界
  61. \B 非单词边界
  62. \A 输入的开头
  63. \G 上一个匹配的结尾
  64. \Z 输入的结尾,仅用于最后的结束符(如果有的话)
  65. \z 输入的结尾
  66. Greedy 数量词
  67. X? X,一次或一次也没有
  68. X* X,零次或多次
  69. X+ X,一次或多次
  70. X{n} X,恰好 n 次
  71. X{n,} X,至少 n 次
  72. X{n,m} X,至少 n 次,但是不超过 m 次
  73. Reluctant 数量词
  74. X?? X,一次或一次也没有
  75. X*? X,零次或多次
  76. X+? X,一次或多次
  77. X{n}? X,恰好 n 次
  78. X{n,}? X,至少 n 次
  79. X{n,m}? X,至少 n 次,但是不超过 m 次
  80. Possessive 数量词
  81. X?+ X,一次或一次也没有
  82. X*+ X,零次或多次
  83. X++ X,一次或多次
  84. X{n}+ X,恰好 n 次
  85. X{n,}+ X,至少 n 次
  86. X{n,m}+ X,至少 n 次,但是不超过 m 次
  87. Logical 运算符
  88. XY X 后跟 Y
  89. X|Y X 或 Y
  90. (X) X,作为捕获组
  91. Back 引用
  92. \n 任何匹配的 nth 捕获组
  93. 引用
  94. \ Nothing,但是引用以下字符
  95. \Q Nothing,但是引用所有字符,直到 \E
  96. \E Nothing,但是结束从 \Q 开始的引用
  97. 特殊构造(非捕获)
  98. (?:X) X,作为非捕获组
  99. (?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off
  100. (?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off
  101. 的非捕获组 (?=X) X,通过零宽度的正 lookahead
  102. (?!X) X,通过零宽度的负 lookahead
  103. (?<=X) X,通过零宽度的正 lookbehind
  104. (?<!X) X,通过零宽度的负 lookbehind
  105. (?>X) X,作为独立的非捕获组


文章来源: bugstack.blog.csdn.net,作者:Yao__Shun__Yu,版权归原作者所有,如需转载,请联系作者。

原文链接:bugstack.blog.csdn.net/article/details/16817771

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。