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/2005\n" +
    "204.45.234.40@02/11/2005\n" +
    "58.27.82.161@02/11/2005\n" +
    "58.27.82.161@02/12/2005\n" +
    "58.27.82.161@02/12/2005\n" +
    "[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 %s\n", 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

 

About: happyhls


发表评论

电子邮件地址不会被公开。 必填项已用*标注