码迷,mamicode.com
首页 > 编程语言 > 详细

Java正则表达式

时间:2019-09-28 10:39:15      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:hone   数字   oid   开始   频率   spl   ssi   mpi   orm   

正则表达式,常用的一些转义字符啥的,拿过来,记下来,用时备查

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正则表达式


Java正则表达式

标签:hone   数字   oid   开始   频率   spl   ssi   mpi   orm   

原文地址:https://www.cnblogs.com/petewell/p/11601763.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!