Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 391|回复: 0

[正则表达式学习]正则表达式使用五例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-1 00:01:24 | 显示全部楼层 |阅读模式

    1. -、分组提取
    2. 以apache log为例,如下:
    3. 192.168.1.138 - - [03/Feb/2006:01:40:20 +0800] "GET /phpinfo.php HTTP/1.1" 404 295
    4. //分别为 客户端IP、访问日期、请求路径、服务端响应Code、请求文件大小
    复制代码
    正则表达式为:
    String pattern=
    "^([\d.]+)(\S+)(\S+)\[([\w:/]+\s[+|-]\d{4})\]\s"(.+)"\s(\d{3})\s(\d+)"; 想到上面正则中括号()的作用了么?可以通过group(i)快速的将每组()中内容提取出来。  第一组([d.]+):将IP地址匹配出来  第四组([w:/]+s[+|-]d{4}):将时间匹配出来  第五组(.+):将客户端请求内容匹配出来  第六组(d{3}):将服务端响应Code匹配出来  第七组(d+):将文件大小匹配出来     
      
    1. 测试程序:
    2.    import java.util.regex.*;
    3. public class Test {
    4.     public static void main(String[] args) {
    5.      String pattern="^([\d.]+)(\S+)(\S+)\[([\w:/]+\s[+|-]\d{4})\]\s"(.+)"\s(\d{3})\s(\d+)";
    6.         String log="192.168.1.138--[03/Feb/2006:01:40:20 +0800] "Get /phpinfo.php HTTP/1.1" 404 295";
    7.       
    8.         System.out.println("pattern: " + pattern);
    9.         System.out.println("log: " + log);
    10.       
    11.         Pattern p = Pattern.compile(pattern);
    12.         Matcher m = p.matcher(log);
    13.       
    14.         if (m.find()) {
    15.             System.out.println("IP Address: " + m.group(1));
    16.             System.out.println("Date&Time: " + m.group(4));
    17.             System.out.println("Request: " + m.group(5));
    18.             System.out.println("Response: " + m.group(6));
    19.             System.out.println("Size: " + m.group(7));
    20.         } else {
    21.             System.out.println("error!");
    22.         }
    23.     }

    24. }

    25.   
    26.     程序输出:
    27.    
    28. C:java>java   Test
    29. pattern: ^([d.]+)(S+)(S+)[([w:/]+s[+|-]d{4})]s"(.+)"s(d{3})s(d+)
    30. log: 192.168.1.138--[03/Feb/2006:01:40:20 +0800] "Get /phpinfo.php HTTP/1.1" 404  295
    31. IP Address: 192.168.1.138
    32. Date&Time: 03/Feb/2006:01:40:20 +0800
    33. Request: Get /phpinfo.php HTTP/1.1
    34. Response: 404
    35. Size: 295
    36. 二、替换匹配的字符串
    37. 假如需要替换掉匹配正则表达式的字符串,我们可以自已使用String类的subString()方法,
    38. 但jdk1.4的正则表达式API中提供了实现此功能的相关方法,如下:
    39. * replaceAll(newString); 替换全部符合正则表达式的子串为newString.
    40. * appendReplacement(StringBuffer, newString); 将字符串中匹配正则的
    41.     子串之前的字符串先传入到StringBuffer中,然后再加上newString。
    42. * appendTail(StringBuffer); 将字符串中匹配最后一个正则表达式后面的
    43.     字符串传入到StringBuffer(通常和appendReplacement一起使用).
    44. 看下面的例子:
    45.    
    46. import java.util.regex.*;
    47. public class Test{  
    48. public static void main(String[] args) {
    49.         // 匹配d开头,接着是a或e最少一次,最多2次,再接着是mon
    50.         // 感觉自已跟唐僧一样,N�嗦 -__-!!
    51.       
    52.         String pattern ="d[ae]{1,2}mon";
    53.         String input ="Unix hath demons and deamons in it!";
    54.         System.out.println("Input:" + input);

    55.         Pattern p = Pattern.compile(pattern);
    56.         Matcher m = p.matcher(input);
    57.         // 两个子串符合: demons, deamons.
    58.         System.out.println("ReplaceAll:A=" + m.replaceAll("A"));

    59.         m.reset();

    60.         StringBuffer sb = new StringBuffer();
    61.         System.out.println("Append methods:");
    62.         
    63.         while (m.find()) {
    64.             m.appendReplacement(sb,"B");
    65.             System.out.println(sb);
    66.         }
    67.       
    68.         m.appendTail(sb);
    69.         System.out.println(sb.toString());
    70.    }
    71. }
    72. 运行结果:
    73. C:java>java   Test
    74. Input:Unix hath demons and deamons in it!
    75. ReplaceAll:A=Unix hath As and As in it!
    76. Append methods:
    77. Unix hath B
    78. Unix hath Bs and B
    79. Unix hath Bs and Bs in it!
    80. 三、查找
    81. 有时候你需要把字符串中匹配正则表达式的那一段找出来,接着前一个例子,
    82. 你可以调用“查找”方法成功后,调用下面的方法将匹配的字符串找出来。
    83. start(), end()  返回字符串中匹配正则表达式的子串的开始位置和结束位置
    84. groupCount()    返回()号匹配的数目,如果有的话。返回0表示没有使用()组,下面将会有介绍
    85. group(int i)    返回正则表达式()匹配的第i组,如果i小于或等于groupCount()则返回相应的()匹配值,
    86.                 如果调用group(0)或group()则返回整个匹配正则表达式的部分
    87. 下面这个例子使用group()直接将整个匹配正则表达式的子字符串取出来:
    88. import java.util.regex.*;
    89. public class Test2{  
    90.       
    91.       public static void main(String[] args) {
    92.         // 匹配Q开头,第二个字符不为u,后面接数字1次或多次,后面再.号
    93.         String pattern ="Q[^u]\d+\.";
    94.         Pattern p = Pattern.compile(pattern);

    95.         String line ="Order QT300. Now !";

    96.         Matcher m = p.matcher(line);
    97.         if (m.find()) {
    98.             // m.group()须调用相关查找方法成功后才能调用
    99.             System.out.println(pattern + " matches "" + m.group() +"" in "" + line +""");
    100.         } else {
    101.             System.out.println("NO MATCH");
    102.         }
    103.     }
    104. }

    105.     // 输出:Q[^u]d+. matches "QT300." in "Order QT300. Now !"

    106. 上面这个例子也可以使用start(), end()方法来完成:
    107. import java.util.regex.*;
    108. public class Test3{  
    109.       
    110.       public static void main(String[] args) {
    111.         String pattern = "Q[^u]\d+\.";
    112.         Pattern p = Pattern.compile(pattern);

    113.         String line = "Order QT300. Now!";
    114.         Matcher m = p.matcher(line);

    115.         if (m.find()) {
    116.             System.out.println(pattern + " matches ""
    117.                     + line.substring(m.start(), m.end()) + "" in "" + line
    118.                     + """);
    119.         } else {
    120.             System.out.println("NO MATCH!");
    121.         }
    122.     }
    123. }
    124.   // 输出:Q[^u]d+. matches "QT300." in "Order QT300. Now !"
    125. 四、转换
    126. 假设你想将字符串:
    127. Smith, John
    128. 通过正则转换为:
    129. John Smith
    130. 可以这样做:
    131. import java.util.regex.*;
    132. public class Test4{  
    133.       
    134.       public static void main(String[] args) {
    135.       
    136.         String line = "Smith, John";
    137.         // 这就是上面所说的()号,如果调用groupCount()的话,将输出2
    138.         // 匹配任何字符0次或多次,然后是","号和空格,再匹配任何字符0次和多次
    139.         // 上面的任何字符不包括换行符
    140.         Pattern p = Pattern.compile("(.*), (.*)");

    141.         Matcher m = p.matcher(line);
    142.         if (m.find()) {
    143.             // 先取上面正则()中匹配的group 2,也就是John
    144.             // 然后再取()中匹配的group 1,也就是Smith
    145.             System.out.println(m.group(2) + " " + m.group(1));
    146.         } else {
    147.             System.out.println("NO MATCH!");
    148.         }
    149.     }
    150. }
    151.     // 输出: John Smith

    152. 再看一个例子:交换两个参数的位置
    153. import java.util.regex.Pattern;
    154. import java.util.regex.Matcher;
    155. public class RearrangeText {
    156.   public static void main(String args[]) {
    157.     String regEx = "(Math.pow)"+                                  // Math.pow
    158.     "\s*\(" +                                                   // Opening parenthesis
    159.     "\s*([+|-]?(\d+\.?\d*|\.\d+)|([a-zA-Z]\w*))" +         // First argument
    160.     "\s*,\s*" +                                                 // Comma
    161.     "([+|-]?(\d+\.?\d*|\.\d+)|([a-zA-Z]\w*))" +             // Second argument
    162.     "\s*\)";                                                    // Closing parenthesis
    163.     String oldCode = "double result = Math.pow( 3.0, 16.0); " +
    164.                 "
    165. double resultSquared = Math.pow(2 ,result );"+
    166.                 "
    167. double hypotenuse = Math.sqrt(Math.pow(2.0, 30.0)+Math.pow(2 , 40.0));";
    168.     Pattern pattern = Pattern.compile(regEx);
    169.     Matcher m = pattern.matcher(oldCode);
    170.     StringBuffer newCode = new StringBuffer();
    171.     while(m.find()) {
    172.       m.appendReplacement(newCode, "$1\($5,$2\)");//$1表示第一组,$i表示第i组
    173.       //System.out.println("OK="+newCode);
    174.    }
    175.     m.appendTail(newCode);
    176.     System.out.println("Original Code:
    177. "+oldCode.toString());
    178.     System.out.println("
    179. New Code:
    180. "+newCode.toString());
    181.   }
    182. }
    183. 运行结果:
    184. C:java>java   RearrangeText
    185. Original Code:
    186. double result = Math.pow( 3.0, 16.0);
    187. double resultSquared = Math.pow(2 ,result );
    188. double hypotenuse = Math.sqrt(Math.pow(2.0, 30.0)+Math.pow(2 , 40.0));
    189. New Code:
    190. double result = Math.pow(16.0,3.0);
    191. double resultSquared = Math.pow(result,2);
    192. double hypotenuse = Math.sqrt(Math.pow(30.0,2.0)+Math.pow(40.0,2));
    193. 五、匹配
    194. 在java中我们可以简单的使用String类的matches()方法来判断当前字符串是否符合
    195. 你所给定的正则表达式模式。matches()方法接受正则表达式做为参数,返回boolean类型。
    196. if (inputString.matches(regexPattern)) {
    197.     // 字符串inputString匹配regexPattern这个模式
    198. }
    199. 代码很简单,但是效率不高,如果在程序中使用不止一次,我们可以使用Pattern和Matcher,例子见下:
    200.    import java.util.regex.*;
    201. public class Test5{  
    202.       
    203.       public static void main(String[] args) throws PatternSyntaxException {
    204.         String pattern = "^Q[^u]\d+\.";
    205.         String input = "Qa777. is the next flight. It is on time.";

    206.         Pattern p = Pattern.compile(pattern);
    207.         boolean found = p.matcher(input).lookingAt();

    208.         System.out.println(""" + pattern + """
    209.                 + (found ? " matches "" : " doesn"t match "") + input + """);
    210.     }
    211. }
    212. 运行结果
    213. C:java>java   Test5
    214. "^Q[^u]d+." matches "Qa777. is the next flight. It is on time."
    215. 六、小结:
    216. 在程序中使用正则表达式的步骤一般如下:
    217. 1. 建立Pattern对象,通过静态方法Pattern.compile();
    218. 2. 取得Matcher对象,通过pattern.matcher(CharSequence charSequence);
    219. 3. 调用Matcher对象的相关查找方法。
    220. java.lang.CharSequence接口是在JDK1.4版本中被添加进来的,它为不同种类的char序列
    221. 提供了统一的只读访问。实现的类有String, StringBuffer, java.nio.CharBuffer
    222. Matcher提供几个不同的查找方法,比String类的matches()方法更灵活,如下:
    223. match() 使用整个字符串与相关模式相比较,和String的matches()差不多
    224. lookingAt() 从字符串开头的地方与相关模式比较
    225. find() 匹配字符串,没有必要从字符串的第一个字符开始,如果前一个操作匹配,
    226. 而且匹配器没有重置的话,则从不匹配的第一个字符开始。
    227. 上面每个方法都返回boolean类型,返回true则意味的匹配,返回false则不匹配。
    228. 要检测给定的String是否匹配给定的模式,只须下面这样就可以了:
    229. Matcher m = Pattern.compile(yourPattern).matcher(yourString);

    230. if (m.find()) {
    231.     System.out.println(“match”);
    232. } else {
    233.     System.out.println(“no match”);
    234. }
    复制代码


      
      
       
       

         
       

         
       
      



    源码下载:http://file.javaxxz.com/2014/11/1/000124421.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 02:52 , Processed in 0.388046 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表