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

Java正则表达式基础

2017-11-02 20:23 260 查看

Java正则表达式基础

1 使用建议

使用正确的边界匹配器(^、$、\b、\B等),限定搜索字符串位置

尽量不适用通配符”.”;字符使用具体的元字符、字符类(\d、\w、\s等)

使用正确的量词(+、*、?、{n,m}),如果能够限定长度,匹配最佳

使用非捕获组、原子组,减少没有必要的字匹配捕获用(?:),减少内存

2 常用预定义匹配符

// 反斜杠
/t 间隔 ('/u0009')
/n 换行 ('/u000A')
/r 回车 ('/u000D')
/d 数字 等价于[0-9]
/D 非数字 等价于[^0-9]
/s 空白符号 [/t/n/x0B/f/r]
/S 非空白符号 [^/t/n/x0B/f/r]
/w 单独字符 [a-zA-Z_0-9]
/W 非单独字符 [^a-zA-Z_0-9]
/f 换页符
/e Escape
/b 一个单词的边界
/B 一个非单词的边界
/G 前一个匹配的结束
^为限制开头
$为限制结尾
.  条件限制除/n以外任意一个单独字符


3 正则表达式中的组

正则表达式中,使用() 将一个表达式代表一个组,每组在整个 表达式中都有对应的引用。 整个表达式,默认是第 0 组,所以说自己声明的组 从 1 开始。

用()括起来的,表示自定义一个组合类型。

4 正则表达式中的特定限制条件

加入特定限制条件「[]」。

[a-z]     条件限制在小写a to z范围中一个字符
[A-Z]     条件限制在大写A to Z范围中一个字符
[a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符
[0-9]     条件限制在小写0 to 9范围中一个字符
[0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符
[0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集)


[]中加入^后加再次限制条件「[^]」.

[^a-z]     条件限制在非小写a to z范围中一个字符
[^A-Z]     条件限制在非大写A to Z范围中一个字符
[^a-zA-Z] 条件限制在非小写a to z或大写A to Z范围中一个字符
[^0-9]     条件限制在非小写0 to 9范围中一个字符
[^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符
[^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集)


5 正则表达式中的匹配量词

在限制条件为特定字符出现0次以上时,可以使用「*」

J*     0个以上J
.*     0个以上任意字符
J.*D     J与D之间0个以上任意字符


在限制条件为特定字符出现1次以上时,可以使用「+」

J+     1个以上J
.+     1个以上任意字符
J.+D     J与D之间1个以上任意字符


在限制条件为特定字符出现有0或1次以上时,可以使用「?」

JA?     J或者JA出现


限制为连续出现指定次数字符「{a}」

J{2}     JJ
J{3}     JJJ


文字a个以上,并且「{a,}」

J{3,}     JJJ,JJJJ,JJJJJ,???(3次以上J并存)


文字个a以上,b个以下「{a,b}」

J{3,5}     JJJ或JJJJ或JJJJJ


两者取一「|」

J|A     J或A
Java|Hello     Java或Hello


6 非打印不可见字符

“非打印不可见字符”实属于ASCII 码中的控制字符,它们是(十进制表示)0到31、以及127。分别代表什么可查询ASCII码表。Java用的是Unicode编码,8位的ASCII码包含在Unicode中,是从0~127的。

◆去除文本的非打印字符

/**
* 替换掉文本的不可见字符,其中"换行符,回车符"不需替换
* @param content
* @return
*/
public static String filter(String content) {
if (content != null && content.length() > 0) {
char[] charArr = content.toCharArray();
//换行,回车不替换
for (int i = 0; i < charArr.length; i++) {
if (((charArr[i] < 0x20) && (charArr[i] != 0x0A) && (charArr[i] != 0x0D)) || charArr[i] == 0x7F) {
charArr[i] = 0x20;
}
}
return new String(charArr);
}
return "";
}


7 使用示例

下面写出几个简单的Java正则用例:

◆比如,在字符串包含验证时

//查找以Java开头,任意结尾的字符串
Pattern pattern = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("Java不是人");
boolean b= matcher.matches();
//当条件满足时,将返回true,否则返回false
System.out.println(b);


◆以多条件分割字符串时

Pattern pattern = Pattern.compile("[, |]+");
String[] strs = pattern.split("Java Hello World Java,Hello,,World|Sun");
for (int i=0;i<strs.length;i++) {
System.out.println(strs[i]);
}


◆文字替换(首次出现字符)

Pattern pattern = Pattern.compile("正则表达式");
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World");
//替换第一个符合正则的数据
System.out.println(matcher.replaceFirst("Java"));


◆文字替换(全部)

Pattern pattern = Pattern.compile("正则表达式");
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World");
//替换第一个符合正则的数据
System.out.println(matcher.replaceAll("Java"));


◆文字替换(置换字符)

Pattern pattern = Pattern.compile("正则表达式");
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sbr, "Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());


◆验证是否为邮箱地址

String str="ceponline@yahoo.com.cn";
Pattern pattern = Pattern.compile("[//w//.//-]+@([//w//-]+//.)+[//w//-]+",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());


◆截取http://地址

“`

//截取url

Pattern pattern = Pattern.compile(“(http://|https://){1}[//w//.//-/:]+”);

Matcher matcher = pattern.matcher(“dsdsdshttp://dsds//gfgffdfdfdf”);

StringBuffer buffer = new StringBuffer();

while(matcher.find()){

buffer.append(matcher.group());

buffer.append(“/r/n”);

System.out.println(buffer.toString());

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