Java正则表达式
正则表达式通常用来查找或替换那些符合某个规则的文本。
在java中,提供正则表达式的支持使用的是java.util.regex包。在这个包中只有两个类:Matcher和Pattern。
Pattern:
该类的定义:public final class Patern extends Object implements Serializable
这个类标识号的是正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例,然后可将得到的模式用于创建Mathcer对象。依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
主要方法:
static Pattern compile(String regex):将给定的正则表达式编译到模式中
static Pattern compile(String regex,int flags):将给定的正则表达式编译到具有给定标志的模式中
Matcher matcher(CharSequence input):创建匹配给定输入与此模式的匹配器
static boolean matches(String regex,CharSequence input):编译给定正则表达式并尝试给定输入与其匹配
在该类中提供的字符匹配类型:
字符 x 字符 x \\ 反斜线字符 \0n 带有八进制值 0 的字符 n (0 <= n <= 7) \0nn 带有八进制值 0 的字符 nn (0 <= n <= 7) \0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) \xhh 带有十六进制值 0x 的字符 hh \uhhhh 带有十六进制值 0x 的字符 hhhh \t 制表符 ('\u0009') \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') \f 换页符 ('\u000C') \a 报警 (bell) 符 ('\u0007') \e 转义符 ('\u001B') \cx 对应于 x 的控制符 字符类 [abc] a、b 或 c(简单类) [^abc] 任何字符,除了 a、b 或 c(否定) [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集) [a-z&&[def]] d、e 或 f(交集) [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去) [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) 预定义字符类 . 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] POSIX 字符类(仅 US-ASCII) \p{Lower} 小写字母字符:[a-z] \p{Upper} 大写字母字符:[A-Z] \p{ASCII} 所有 ASCII:[\x00-\x7F] \p{Alpha} 字母字符:[\p{Lower}\p{Upper}] \p{Digit} 十进制数字:[0-9] \p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}] \p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ \p{Graph} 可见字符:[\p{Alnum}\p{Punct}] \p{Print} 可打印字符:[\p{Graph}\x20] \p{Blank} 空格或制表符:[ \t] \p{Cntrl} 控制字符:[\x00-\x1F\x7F] \p{XDigit} 十六进制数字:[0-9a-fA-F] \p{Space} 空白字符:[ \t\n\x0B\f\r] java.lang.Character 类(简单的 java 字符类型) \p{javaLowerCase} 等效于 java.lang.Character.isLowerCase() \p{javaUpperCase} 等效于 java.lang.Character.isUpperCase() \p{javaWhitespace} 等效于 java.lang.Character.isWhitespace() \p{javaMirrored} 等效于 java.lang.Character.isMirrored() Unicode 块和类别的类 \p{InGreek} Greek 块(简单块)中的字符 \p{Lu} 大写字母(简单类别) \p{Sc} 货币符号 \P{InGreek} 所有字符,Greek 块中的除外(否定) [\p{L}&&[^\p{Lu}]] 所有字母,大写字母除外(减去) 边界匹配器 ^ 行的开头 $ 行的结尾 \b 单词边界 \B 非单词边界 \A 输入的开头 \G 上一个匹配的结尾 \Z 输入的结尾,仅用于最后的结束符(如果有的话) \z 输入的结尾 Greedy 数量词 X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{n} X,恰好 n 次 X{n,} X,至少 n 次 X{n,m} X,至少 n 次,但是不超过 m 次 Reluctant 数量词 X?? X,一次或一次也没有 X*? X,零次或多次 X+? X,一次或多次 X{n}? X,恰好 n 次 X{n,}? X,至少 n 次 X{n,m}? X,至少 n 次,但是不超过 m 次 Possessive 数量词 X?+ X,一次或一次也没有 X*+ X,零次或多次 X++ X,一次或多次 X{n}+ X,恰好 n 次 X{n,}+ X,至少 n 次 X{n,m}+ X,至少 n 次,但是不超过 m 次 Logical 运算符 XY X 后跟 Y X|Y X 或 Y (X) X,作为捕获组 Back 引用 \n 任何匹配的 nth 捕获组 引用 \ Nothing,但是引用以下字符 \Q Nothing,但是引用所有字符,直到 \E \E Nothing,但是结束从 \Q 开始的引用 特殊构造(非捕获) (?:X) X,作为非捕获组 (?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off (?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off 的非捕获组 (?=X) X,通过零宽度的正 lookahead (?!X) X,通过零宽度的负 lookahead (?<=X) X,通过零宽度的正 lookbehind (?<!X) X,通过零宽度的负 lookbehind (?>X) X,作为独立的非捕获组
Matcher:
该类的定义如下:
public final class Matcher extends Object implements MatchResult
通过解释Pattern对字符串执行匹配操作。
该类提供的主要方法:
boolean matches():尝试将整个区域与模式匹配
boolean hitEnd():如果匹配器执行的最后匹配操作中搜索引擎遇到输入结尾,则返回true
boolean lookingAt():尝试将从区域开头开始的输入序列与该模式匹配
实例:
package com.fuwh.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexTest01 { public static void main(String[] args) { //通过Pattern类直接匹配 System.out.println(Pattern.matches("w{3}", "www")); System.out.println("www.baidu.com是个网址:"+Pattern.matches("w{3}\\.[a-zA-Z0-9]+\\.[a-z]{2,6}","www.baidu.com")); System.out.println("www.baidu.c是个网址:"+Pattern.matches("w{3}\\.[a-zA-Z0-9]+.[a-z]{2,6}","www.baidu.c")); System.out.println("wwh.baidu.cn是个网址:"+Pattern.matches("w{3}\\.[a-zA-Z0-9]+\\.[a-z]{2,6}","wwh.baidu.com")); System.out.println("**********************************"); //通过Matcher类 Pattern pattern=Pattern.compile("w{3}\\.[a-zA-Z0-9]+\\.[a-z]{2,6}"); Matcher matcher1=pattern.matcher("www.baidu.com"); Matcher matcher2=pattern.matcher("www.baidu.c"); Matcher matcher3=pattern.matcher("wwh.baidu.com"); System.out.println("www.baidu.com是个网址:"+matcher1.matches()); System.out.println("www.baidu.c是个网址:"+matcher2.matches()); System.out.println("wwh.baidu.cn是个网址:"+matcher3.matches()); } }
实际上,在String类中,现在早已经支持正则了,所以,我们可以直接通过String类的对象来进行正则的匹配。
使用String类中的如下方法:
boolean matches(String regex)
实例:
package com.fuwh.regex; public class RegexTest02 { public static void main(String[] args) { //通过String类直接匹配 String s1="www.baidu.com"; String s2="www.baidu.c"; String s3="wwh.baidu.com"; System.out.println("www.baidu.com是个网址:"+s1.matches("w{3}\\.[a-zA-Z0-9]+\\.[a-z]{2,6}")); System.out.println("www.baidu.c是个网址:"+s2.matches("w{3}\\.[a-zA-Z0-9]+.[a-z]{2,6}")); System.out.println("wwh.baidu.cn是个网址:"+s3.matches("w{3}\\.[a-zA-Z0-9]+\\.[a-z]{2,6}")); } }
实用正则;
^\\d+$ //非负整数(正整数 + 0) ^[0-9]*[1-9][0-9]*$ //正整数 ^((-\\d+)|(0+))$ //非正整数(负整数 + 0) ^-[0-9]*[1-9][0-9]*$ //负整数 ^-?\\d+$ //整数 ^\\d+(\\.\\d+)?$ //非负浮点数(正浮点数 + 0) ^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$ //正浮点数 ^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$ //非正浮点数(负浮点数 + 0) ^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //负浮点数 ^(-?\\d+)(\\.\\d+)?$ //浮点数 ^[A-Za-z]+$ //由26个英文字母组成的字符串 ^[A-Z]+$ //由26个英文字母的大写组成的字符串 ^[a-z]+$ //由26个英文字母的小写组成的字符串 ^[A-Za-z0-9]+$ //由数字和26个英文字母组成的字符串 ^\\w+$ //由数字、26个英文字母或者下划线组成的字符串 ^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$ //email地址 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:\n\s*\r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力 匹配首尾空白字符的正则表达式:^\s*|\s*$ 评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 评注:表单验证时很实用 匹配网址URL的正则表达式:[a-zA-z]+://[^\s]* 评注:网上流传的版本功能很有限,上面这个基本可以满足需求 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实用 匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7} 评注:匹配形式如 0511-4405222 或 021-87888822 匹配腾讯QQ号:[1-9][0-9]{4,} 评注:腾讯QQ号从10000开始 匹配中国邮政编码:[1-9]\d{5}(?!\d) 评注:中国邮政编码为6位数字 1. 检查URL的前缀 应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。 if (!s.match(/^[a-zA-Z]+:\\/\\//)) { s = 'http://' + s;} 2. 提取URL链接 下面的这个表达式可以筛选出一段文本中的URL。 ^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)? 3. 文件路径及扩展名校验 验证windows下文件路径和扩展名(下面的例子中为.txt文件) ^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$ 4. 提取Color Hex Codes 有时需要抽取网页中的颜色代码,可以使用下面的表达式。 ^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$ 5. 提取网页图片 假若你想提取网页中所有图片信息,可以利用下面的表达式。 \\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*) 6. 提取页面超链接 提取html中的超链接。 (<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)> 7. 查找CSS属性 通过下面的表达式,可以搜索到相匹配的CSS属性。 ^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1} 8. 抽取注释 如果你需要移除HMTL中的注释,可以使用如下的表达式。 <!--(.*?)--> 9. 匹配HTML标签 通过下面的表达式可以匹配出HTML中的标签属性。 <\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?> 转载自:http://blog.csdn.net/xiaoshiyiqie/article/details/52852158