正则表达式及其常用语法

常用语法

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

表1 常用语法
正则表达式匹配示例
x指定字符xJava匹配Java
.除了换行符外的任意单个字符Java匹配J..a
(ab|cd)ab或者cdten匹配t(en|im)
[abc]a、b或者cJava匹配Ja[uvwx]a
[^abc]除了a、b或c之外的字符Java匹配Ja[ ^asx]a
[a-z]a到zJava匹配[A-M]av[a-z]
[^a-z]除了a-z之外的任意字符Java匹配[ ^A-C]av[ ^b-d]
[a-e[m-p]]a到e或m-pJava匹配[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[\\s]2"
\S非空白字符Java匹配"[\\S]ava"
p*0或者多次出现模式paaaa匹配"a*"
p+1或者多次出现模式p

a匹配"a+b*"

able匹配"(ab)+. *"

p?0此或者1次出现模式p

Java匹配"J?Java"

ava匹配"J?ava"

p{n}正好出现n次模式pJava匹配"Ja{1}.*"
p{n,}至少出现n次模式p

aaaa匹配"a{1,}"

a不匹配"a{2,}"

p{n,m}[n,m]次出现模式p

aaaa匹配"a{1,9}"

abb不匹配"a{2,9}b{2}"

\p{P}一个标点字符!"#$%&'()*+,-./:;<=>?@[\]^_'{|}~

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

J?1a不匹配"J\p{P}a"

注意

  1. 反斜杠是一个特殊的字符,在字符串中开始转义序列。因此在Java中需要使用\ \来表示\

  2. 空白字符是' '、'\t'、'\n'、'\r'、'\f',因此,\s和[\t\n\r\f]等同,\S和[ ^\t\n\r\f]等同

  3. 单词字符是任何的字母、数字或者下划线字符,因此\w等同于[a-z[A-Z] [0-9]_],或者简化为[a-Za-z0-9_],\W等同于[ ^a-Za-z0-9_]

  4. 上表中的后面6个条目*、+、?、{n}、{n,}以及{n,m}称为量词符,用于确定量词符前面的模式会重复多少次。

  5. 不要在重复量词符中使用空白,例如A{3,6}不能写成逗号后面有一个空白符的A{3, 6}

  6. 可以使用括号来将模式进行分组,例如,(ab){3}匹配ababab,但是ab{3}匹配abbb

示例

  1. 社会安全号的模式是xxx-xx-xxxx,其中x是一位数字,其正则表达式可以为:

    [0-9]{3}-[0-9]{2}-[0-9]{4} 或者 [\\d]{3}-[\\d]{2}-[\\d]{4}:

    "111-22-3333".matches("[0-9]{3}-[0-9]{2}-[0-9]{4}");//true
    "111-22-333".matches("[0-9]{3}-[0-9]{2}-[0-9]{4}");//false
  2. 偶数以数字0、2、4、6、8结尾,偶数的模式可以描述为:

    [0-9]*[02468] 或者[\\d]*[02468]

  3. 电话号码的模式是(xxx)xxx-xxxx,其中x是一位数字,并且第一位数字不能为0,其正则表达式可以为:

    \\([1-9][0-9]{2}\\)[0-9]{3}-[0-9]{4} 或者\\([1-9][\\d]{2}\\)[\\d]{3}-[\\d]{4}

  4. 假定姓由最多25个字母组成,并且第一个字母为大写形式,则姓的模式可以描述为:

    [A-Z][a-z[A-Z]]{1,24}

  5. Java中的标识符必须以字母、下划线、或者美元符号开头,不能以数字开头;必须由字母、数字、下划线、美元符号组成的字符序列,则标识符的模式可以描述为:

    [a-zA-z_$][a-Za-z0-9$_]*或者[a-zA-z$_][\\w$]*

  6. ".*"匹配任何字符串

用正则表达式替换和拆分字符串

  • matches()方法匹配字符串

  • replaceAll()方法替换所有匹配的子字符串

    "Java Java Java".replaceAll("v\\w","wi");//Jawi Jawi Jawi
  • replaceFirst()方法替换第一个匹配的子字符串

    "Java Java Java".replaceFirst("v\\w","wi");//Jawi Java Java
  • 重载了split(regex)方法,使用匹配的分隔符将一个字符串拆分为子字符串

    "Java1HTML2Perl".split("\\d");//拆分为Java,HTML,Per
  • spilt(regex,llimit)方法,limit参数确定匹配模式匹配多少次,如果limit<=0,spilt(regex,llimit)等同于spilt(regex);如果limit>0,模式最多匹配limit-1次

    "Java1HTML2Perl".split("\\d",0);//拆分为Java,HTML,Per
    "Java1HTML2Perl".split("\\d",1);//拆分为Java1HTML2Per
    "Java1HTML2Perl".split("\\d",2);//拆分为Java,HTML2Per
    "Java1HTML2Perl".split("\\d",3);//拆分为Java,HTML,Per
    "Java1HTML2Perl".split("\\d",4);//拆分为Java,HTML,Per

注意

在默认情况下,所有的量词符都会尽可能匹配多次。在后面添加问号?来把量词符改成匹配尽可能少的次数

"Jaaavaa".replaceFirst("a+","R");//JRva,匹配aaa
"Jaaavaa".replaceFirst("a+?","R");//JRaava,匹配a
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值