正则表达式-JAVA


转载请标明出处:
http://blog.csdn.net/tyzlmjj/article/details/48106091
本文出自:【M家杰的博客】

初学者视角:正则表达式是一种字符串搜索和匹配的工具


java中的关键类和方法

  • Pattern 类,正则表达式的编译表示形式。
    Pattern.compile(String) 填写正则表达式
    Pattern.compile(String,int) 填写正则表达式和修正模式的标识
    Pattern.matcher(CharSequence) 填入目标字符串,返回Matcher
    Pattern.matches(String, CharSequence) 直接填入正则表达式和目标字符串进行匹配。

  • Matcher类, 通过解释 Pattern 对 字符串 执行匹配操作的引擎。
    Matcher.matches()将整个字符串与模式匹配。
    Matcher.find()在字符串中查找匹配的下一个子串
    Matcher.group()返回匹配的字符串
    Matcher.replaceAll(String)将整个字符串中匹配的子串改为填人的字符串

Pattern 类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。

  • 官方API例子:
 //经典写法
 Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();
//简便写法
boolean b = Pattern.matches("a*b", "aaaaab");

界定符

表示一个正则表达式的开始和结束
界定符的形式在不同语言中有所不用
Java中似乎不需要界定符
php中界定符为:/或者#或者{}


原子

  • 可见原子(Unicode编码表中用键盘输出后肉眼可见的字符)
    • 标点 ; ” _ ? . 等等
    • 英文字母数字 a-z,A-Z,0-9
    • 汉字、日文、阿拉伯文等其他语言文字
    • 数理化公式等其他可见字符
  • 不可见原子(Unicode编码表中用键盘输出后肉眼不可见的字符)
    • 换行符 \n
    • 回车 \r
    • 制表符 \t
    • 空格
    • 等等其他不可见符号

元字符

  • | 匹配两个或者多个分支选择
  • [] 匹配方括号中的任意一个原子
  • [^] 匹配除方括号中的原子之外的任意字符
  • .任何字符(与行结束符可能匹配也可能不匹配)
  • \d 数字:[0-9]
  • \D 非数字: [^0-9]
  • \s 空白字符:[ \t\n\x0B\f\r]
  • \S非空白字符:[^\s]
  • \w 单词字符(注意包含下划线):[a-zA-Z_0-9]
  • \W 非单词字符:[^\w]

|[]的区别在于,|是取左右的一整串字符串去匹配,[]是取括号中的任意单个字符去匹配

特别的写法:
[ab]cd 匹配”acd”和”bcd”


量词

  • {n} 表示其前面的原子恰好出现n次
  • {n,} 表示其前面的原子最少出现了n次
  • {n,m} 表示其前面的原子最少出现n次,最多出现m次
  • * 匹配0次、1次或者多次其之前的原子,等同于{0,}
  • + 匹配1次或者多次其之前的原子,等同于{1,}
  • ? 匹配0次或者1次其之前的原子,等同于{0,1}

特别的写法:
A?K 匹配”AK”和”K”


边界控制

  • ^ 匹配字符串开始的位置
  • $ 匹配字符串结束的位置

^abcde$ 表示整个字符串开始必须为”a”,结束必须为”e”


修正模式

1.贪婪匹配(默认)

匹配结果存在歧义时取其长

2.懒惰匹配

匹配结果存在歧义时取其短
JAVA开启懒惰匹配:好像没有专门的这种模式,只能自己写,使用:.*?
例如表达式:mjj.*?asd 匹配字段:mjj_-1asdasdasd
PHP开启懒惰匹配:在界定符号后面加大写U。例:/[0-9]/U

3.忽略英文字母大小写

JAVA开启:Pattern.CASE_INSENSITIVE
PHP开启:在界定符号后面加小写i。例:/[0-9]/i

4.忽略空白

JAVA开启:Pattern.COMMENTS
PHP开启:在界定符号后面加小写x。例:/[0-9]/x

5.让.可以匹配换行符

JAVA开启:Pattern.DOTALL
PHP开启:在界定符号后面加小写s。例:/[0-9]/s


模式单元

  • ()模式单元的存在可以使对字符串的操作更加灵活

特别的写法:
(M|A)asd 匹配”Masd”和”Aasd”

java模式单元的例子:

String str = "mjj.mjjmjj@qq.com";
String regex = "^\\w+(\\.\\w+|\\-\\w+)*@\\w+(\\.\\w+)+$";
Matcher matcher = Pattern.compile(regex).matcher(str);
matcher.matches();
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));

打印结果:

mjj.mjjmjj@qq.com
.mjjmjj
.com

例子中regex表达式的整体为总模式(\\.\\w+|\\-\\w+)(\\.\\w+)子模式
可以从打印结果看出,我们可以利用模式单元方便的拆分出想要的子串
java中通过Matcher.group(int)方法获取


注意事项

  1. 在匹配中文时会因为编码不同(UTF-8,GBK等等)而造成错误,比较好的解决方法是将表达式中的中文转为Unicode编码
  2. 在Java中特别需要注意\,php中写\d在Java中写\\d

简单示例(JAVA)

非空:.+
两位浮点型:^\\d+\\.\\d{2}$
简单邮箱地址:^\\w+(\\.\\w+|\\-\\w+)*@\\w+(\\.\\w+)+$
简单的URL:^(https?://)?(\\w+\\.)+[a-zA-Z]+$

参考资料

JavaTM Platform Standard Ed. 6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值