Java正则表达式的学习(一)

    xiaoxiao2021-12-14  54

    Java正则表达式(Regular Expression)基础

    正则表达式(代码中简写为:regex)的基本写法:

    字符{数量}位置 例如: [0,9]{2,4}\b 可以匹配 123 34 5678 1988

    正则表达式的基本元素

    字符含义描述·代表一个字符的通配符能和回车符以外的任何字 符相匹配[]字符集能和括号内的任何一个字符相匹配。方括号内也可以表示一个范围,用”—”符号将起始和末尾字符区分开来, 例如[0-9][^]排斥性字符集和集合之外的任意字符匹配^起始位置定位到一行的起始处并向后匹配$结束位置定位到一行的结尾处并向前匹配\b单词边界\B非单词边界()组按照子表达式进行分组|或或关系的逻辑选择,通常和组结合使用\转义匹配反斜线符号之后的字符,所以可以匹配一些特殊符号,例如$和|

    关于数量

    符号含义描述*零个或多个匹配表达式首项字符的零个或多个副本+一个或多个匹配表达式首项字符的一个或多个副本?零个或一个匹配表达式首项字符的一个或零个副本n重复匹配表达式首项字符的n个副本

    关于字符

    • \d 表示数字,相当于[0-9] • \D 表示非数字,相当于 [^0-9] • \s 表示空白符,相当于 [ \t\n\x0B\f\r] • \S 表示非空白符,相当于[^\s] • \w 表示单词字符,相当于 [a-zA-Z_0-9] • \W 表示非单词字符,相当于 [^\w]

    例如:

    匹配html源代码中的网址可用以下正则表达式: \b(href)=('[^']+') 匹配出来网址的字符串表示一般为: href=’https://www.baidu.com’ href=’https://www.google.com.tw’ 等等。 对以上正则表达式的解释: 首先\b表示单词边界的意思,意思是说对于(href)来说,其前面为空格、’<’等非字母字符,而接下来的(href)来说,意思是说(href)作为子表达式分组匹配,那么表达式到现在将会匹配href…字符,而=是一个普通字符,原样匹配。再来就是另外一个子表达式('[^']+'),这个表达式的意思即是:一开始是匹配一个',然后[^']是要匹配非'字符(^的意思是非),紧接着的+是指匹配一个或多个这样的字符,即是要匹配aaa,a123,b23df这样的字符串。而后则继续是匹配一个',到这里完成一个对网址匹配的正则表达式的书写。

    正则表达式的基本应用

    1.字符串的分割

    例如:对以逗号或空白符分隔的输入字符串进行切分

    import java.util.regex.*; public class RegexSplitter { public static void main(String[] args) throws Exception { Pattern p = Pattern.compile( "[,\\s]+"); String[] result = p.split( "one,two, three four , five "); for (int i = 0; i < result.length; i++) { System.out.println(result[i]); } } }

    程序输出结果: 对以上正则匹配的解释:[,\\s]+,其中[]中的内容表示要匹配的字符,因为对于特殊字符需要转义才能正常显示,因此对'\s'需要转义,而[]后面接着+,说明匹配一个或多个这样的字符。 补充:\s表示空白符,在Java中空白符为以下字符: \t\n\x0B\f\r (第一个字符为空格) \t为制表符,即Tab; \n为换行字符; \x0B与Tab原理一样,不过是垂直方向的; \f为换页字符; \r为回车字符。 其中 空格符 制表符 换行符最常用 在C语言中(不知道为什么java输出正常): \r 回车就是回到当前行的行首,并且会覆盖当前行的输出 \n 回车并换行另起一行,并回到另起一行的行首。

    2.字符串的匹配验证

    例如:判断一个email地址是否合法

    import java.util.regex.*; public class RegexEmailValidate { public static void main(String[] args) throws Exception { String pattern = "^[^@]+@[\\w]+(\\.[\\w]+)+$"; String email1 = "adherersun@163.com"; String email2 = "@@@adherersun@163.com"; String email3 = "adherersun@163"; boolean ok1 = Pattern.matches( pattern, email1 ); boolean ok2 = Pattern.matches( pattern, email2 ); boolean ok3 = Pattern.matches( pattern, email3 ); System.out.println( "email1 is " + ok1 ); System.out.println( "email1 is " + ok2 ); System.out.println( "email1 is " + ok3 ); } }

    程序输出结果: 说明:单个的^字符表示匹配起始位置,而$表示匹配的结束位置

    3.字符串的查找替换

    Matcher类

    通过调用某个模式(Pattern对象)的matcher方法可以得到Matcher对象

    Matcher类的方法

    1.find方法将扫描输入序列,寻找下一个与模式匹配的地方. 2.利用appendReplacement方法.

    Matcher中的group

    1.所谓group(分组),是指正则表达式中一对圆括号括起来的一部分. 2.group(0)或group()表示整个正则表达式匹配项,group(1)、group(2)…表示各个分组. 3.替换时,$0表示整个匹配项, $1,$2…表示各个分组(圆括号).

    import java.util.regex.*; public class RegexReplacement { public static void main(String[] args) throws Exception { Pattern pattern = Pattern.compile("cat"); Matcher matcher = pattern.matcher( "one cat, two cats in the yard"); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, "big $0"); } matcher.appendTail(sb); System.out.println(sb.toString()); } }

    关于这个程序中使用的方法的解释将在正则表达式第二篇的学习中涉及到。 一个从网页内容中找到链接网址的小例子:

    import java.util.regex.*; public class RegexHref { public static void main(String[] args) throws Exception { String patternString = "\\s*(href|src)\\s*=\\s*(\"([^\"]*\")|(\'[^\']*\')|([^\'\">\\s]+))"; String text = "<a href=\"http://aaa.htm\">bbb</a> <img src=\"http://bb.com/pic.jpg\">"; Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher( text ); StringBuffer buffer = new StringBuffer(); while (matcher.find()) { //整个捕获,相当于goup(0) buffer.append("获捕到" + matcher.group()); //捕获中的一部分(第2对圆括号对应的,即是网址) buffer.append(" 其中网址为" + matcher.group(2)); buffer.append("\r\n"); } System.out.println(buffer.toString()); } }

    程序输出结果: 未完待续见Java正则表达式学习(二)

    转载请注明原文地址: https://ju.6miu.com/read-970271.html

    最新回复(0)