Java正则表达式
Posted petewell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式,常用的一些转义字符啥的,拿过来,记下来,用时备查
1、特殊字符
^ 一行的开头
$ 一行的结束
() 表达式
[] 表达式
{} 表达式出现的频率 {1}出现1次,{1-3}出现1-3次
* 任意次
+ 一次或多次
? 0次或1次
. 除了换行符之外的任意字符
转义后面的字符
| 多种匹配的或
2、预定义的字符
d digital 数字
D NOT DIGITAL 非数字
s space 空白字符 包括 空格|制表符|回车符|换页符|换行符 等等
S NOT SPACE 非空白字符
w word单词字符 包括 0-9|A-Z|a-z|_
W NOT WORD 非单词字符
3、方括号的用法
(1)枚举 [abc]表示a、b、c中的任意一个字符
(2)表示范围(-) [a-z]表示从字符a-字符z
(3)表示求否(^) [^a-z]表示除了a-z之外的其他字符
(4)表示运算与(&&) [a-z&&[def]]表示d、e或者f
(5)表示运算并 [a-d[m-p]]表示a-dm-p
4、边界控制
b 单词边界
B 非单词边界
A 输入的开头
G 前一个匹配的结尾
Z 输入的结尾,仅仅用于最后的结束符
z 输入的结尾
5、正则表达式工作模式:Greedy(贪婪模式)->默认、Reluctant(勉强模式)-?、Possessive(占有模式、仅Java,少用)-+ Greedy:尽可能多的匹配 Reluctant:尽可能烧得匹配 常用正则表达式:
匹配中文字符的正则表达式: [/u4e00-/u9fa5]
匹配双字节字符(包括汉字在内):[^/x00-/xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^/x00-/xff]/g,”aa”).length;}
匹配空行的正则表达式:/n[/s| ]/r
匹配html标记的正则表达式:/<(.)>.|<(.) //>/
匹配首尾空格的正则表达式:(^/s)|(/s$)
Java的使用
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex {
public static void main(String[] args)
{
String data=”This is your phone number: 123-456-789”;
Pattern p=Pattern.compile(“d+-d+-d+”);
Matcher m=p.matcher(data);
if(m.matches())
System.out.println(“matches():”+m.group());
else
System.out.println(“matches not found!”);
if(m.lookingAt())
System.out.println(“lookingAt():”+m.group());
else
System.out.println(“lookingAt not found”);
if(m.find())
System.out.println(“find():”+m.group());
else
System.out.println(“find() not found”);
Pattern p_tmp=Pattern.compile("s");
String[] str=p_tmp.split(data);
for(String tmp:str)
{
System.out.println(tmp);
}
}
}
其运行结果为
matches not found!
lookingAt not found
find():123-456-789
This
is
your
phone
number:
123-456-789
在运行的时候,出现过 Invalid escape sequence (valid ones are b t n f r “ ‘ )的错误,其错误原因为
Pattern p=Pattern.compile(“d+-d+-d+”);
之前写成了
Pattern p=Pattern.compile(“d+-d+-d+”);
而在Java中,是保留字符,因此必须使用将其转义 在上述文中中在匹配之后调用过3种方法 matches()、lookingAt()、find()其主要的区别如下: matches()是对整个字符串进行匹配,只有整个字符串都匹配成功了,才会返回true lookingAt()是对前面的字符进行匹配,只有匹配的字符位于整个字符串的最前面,才会返回true find()则是只要在整个字符串中匹配到相应的字符,无论在什么位置,都返回true 如果查找到字符串,则调用 m.group(),可以返回子字符串,另外还有 m.start() m.end()返回开始及结束的位置 在Java中还有spilit函数用于将字符串分离,如上面中使用s来使用空格分离单词 reset()函数,用来在寻找完成下一个字符串之后,继续用来在下一个字符串中寻找。
在Java的正则表达式中,分组也是很好用的一个功能,如下:
import java.util.regex.;
import java.util.;
public class ThreatAnalyzer {
static String threatData =
“58.27.82.161@02/10/2005n” +
“204.45.234.40@02/11/2005n” +
“58.27.82.161@02/11/2005n” +
“58.27.82.161@02/12/2005n” +
“58.27.82.161@02/12/2005n” +
“[Next log section with different data format]“;
public static void main(String[] args) {
Scanner scanner = new Scanner(threatData);
String pattern = “(d+[.]d+[.]d+[.]d+)@” +
“(d{2}/d{2}/d{4})”;
while(scanner.hasNext(pattern)) {
scanner.next(pattern);
MatchResult match = scanner.match();
String ip = match.group(1);
String date = match.group(2);
System.out.format(“Threat on %s from %sn”, date,ip);
}
}
}
其中正则表达式如下:
String pattern = “(d+[.]d+[.]d+[.]d+)@” +
“(d{2}/d{2}/d{4})”;
在每次输入中获取需要的IP地址和日期,同时使用()将正则表达式分组,那么最终的结果中,IP地址保存在group(1)中,而date则保存在group(2)中。同时将字符“@”滤除。需要好好学习。其运行的结果如下:
Threat on 02/10/2005 from 58.27.82.161
Threat on 02/11/2005 from 204.45.234.40
Threat on 02/11/2005 from 58.27.82.161
Threat on 02/12/2005 from 58.27.82.161
Threat on 02/12/2005 from 58.27.82.161
以上是关于Java正则表达式的主要内容,如果未能解决你的问题,请参考以下文章