您的位置:首页 > 编程语言 > Java开发

正则表达式-JAVA

2015-08-30 16:41 591 查看
转载请标明出处:

/article/8129709.html

本文出自:【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)
方法获取

注意事项

在匹配中文时会因为编码不同(UTF-8,GBK等等)而造成错误,比较好的解决方法是将表达式中的中文转为Unicode编码

在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: