正则表达式

正则表达式是一个字符串,用来描述匹配一个字符串集合的模式。

可以使用正则表达式处理字符串,例如:匹配、替换和拆分字符串。

  • 语法

正则表达式由字面值字符和特殊符号组成。

一、常用的正则表达式

代码

匹配

示例

x

指定字符x

Java匹配Java

.

任意单个字符,除了换行符外

Java匹配J..a

(ab|cd)

ab或者cd

ten匹配t(en|im)

[abc]

a、b或者c

Java匹配Ja[uvwx]a

[^abc]

除了ab或者c外的任意字符

Java匹配Ja[^ars]a

[a-z]

a到z

Java匹配[A-M]av[a-d]

[^a-z]

除了a到z外的任意字符

Java匹配Jav[^b-d]

[a-e[m-p]]

a到e或m到p

Java匹配[A-G[I-M]]av[a-d]

[a-e&&[c-p]]

a到e与c到p的交集

Java匹配[A-P&&[I-M]]av[a-d]

\d

一位数字,等同于[0-9]

Java2匹配”Java[\\d]”

\D

一位非数字

$Java匹配”[\\D][\\ D]ava”

\w

单词字符

Java1匹配”[\\w]ava[\\d]”

\W

非单词字符

$Java匹配”[\\W][\\ w]ava”

\s

空白字符

“Java 2”匹配“Java\\s2”

\S

非空白字符

Java匹配”[\\S]ava”

P*

0或者多次出现模式p

aaaa匹配”a*”

abab匹配”(ab)*”

P+

1或者多次出现模式p

a匹配”a+b*”

able匹配”(ab)+.*”

P?

0或者1次出现模式p

Java匹配”J?Java”

ava匹配”J?Java”

P{n}

正好出现n次模式p

Java匹配”Ja{1}.*”

Java不匹配”.{2}”

P{n,}

至少出现n次模式p

aaaa匹配”a{1,}”

a不匹配”a{2,}”

P{n,m}

n到m(不包含)次出现模式p

aaaa匹配”a{1,9}”

abb不匹配”a{2,9}bb”

\p{P}

一个标点字符

!”#$%&’()*+,-./:;<=>?@[\]^_’{|}~

J?a匹配”J\p{P}a”

J?a不匹配”J\p{P}a”

二、其它的正则表达式

        1.社会安全号:xxx-xx-xxx  (x为数字)

正则表达式为:[\\d{3}-[\\d]{2}-[\\d]{4}

例如:”111-22-3333”.matches(“[\\d]{3}-[\\d]{2}-[\\d]{4}”) returns true.

  ”11-22-3333”.matches(“[\\d]{3}-[\\d]{2}-[\\d]{4}”) returns false.

        2.偶数以数字0、2、4、6或者8结尾。

正则表达式:[\\d]*[02468]

例如:”123”.matches(“[\\d]*[02468]”) returns false.

    ”122”.matches(“[\\d]*[02468]”) returns true.

        3.电话号码:(xxx)xxx-xxxx  (x为数字且第一位数字不为0)

正则表达式为:\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}

例如:”(912) 921-2728”.matches(“\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}”) returns true.

    ”921-2728”.matches(“\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}”) returns false.

        4.姓:(假定姓最多由25个字母组成且第一个字母为大写字母)

正则表达式:[A-Z][a-zA-Z]{1,24}

例如:”Smith”.matches(“[A-Z][a-zA-Z]{1,24}”) returns true.

  ”Jones123”.matches(“[A-Z][a-zA-Z]{1,24}”) returns false.

        5.标识符:

正则表达式:[a-zA-Z_$][\\w$]*

        6.任何字符串匹配正则表达式”.*”

  • 匹配字符串

正则表达式 ”Java.*” 描述了一个字符串模式。

String类中的matches不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集,返回ture。在使用正则表达式时matches极为重要。

例如:”Java”.matches(“Java”)

“Java is fun”.matches(“Java.*”)

“Java is cool”.matches(“Java.*”)

“Java is powerful”.matches(“Java.*”)

以Java开始,后面跟0个或者多个字符串。

.*匹配0或者多个任意字符。

  • 替换字符串

replaceAll方法替换所有匹配的子字符串。

replaceFirst方法替换第一个匹配的子字符串。

例如:代码:System.out.println(“Java Java Java”.replaceAll(“v\\w”,“wi”));

  显示:Jawi Jawi Jawi

  代码:System.out.println(“Java Java Java”.replaceFirst(“v\\w”,“wi”));

  显示:Jawi Java Java

  • 拆分字符串

split(regex)方法使用匹配的分隔符将一个字符串拆分为子字符串。

例如:String tokens = “Java1HTML2Perl”.split(“\\d”);

  将字符串“JavaHTML2Perl”拆分为Java、HTML以及Perl并且保存在tokens[0], tokens[1]以及tokens[2]中。

split(regex,limit)方法中limit参数确定模式匹配多少次。

如果limit<=0,split(regex,limit)等同于split(regex)。

如果limit>0,模式最多匹配limit-1次。

例如:“Java1HTML2Perl”.split(“\\d”,0); 拆分为Java,HTML,Perl

  “Java1HTML2Perl”.split(“\\d”,1); 拆分为Java1HTML2Perl

“Java1HTML2Perl”.split(“\\d”,2); 拆分为Java,HTML2Perl

“Java1HTML2Perl”.split(“\\d”,3); 拆分为Java,HTML,Perl

“Java1HTML2Perl”.split(“\\d”,4); 拆分为Java,HTML,Perl

“Java1HTML2Perl”.split(“\\d”,5); 拆分为Java,HTML,Perl