0
点赞
收藏
分享

微信扫一扫

java匹配规则

正则表达式的匹配规则是从左到右按规则匹配。我们首先来看如何使用正则表达式来做精确匹配。

对于正则表达式​​abc​​来说,它只能精确地匹配字符串​​"abc"​​,不能匹配​​"ab"​​,​​"Abc"​​,​​"abcd"​​等其他任何字符串。

如果正则表达式有特殊字符,那就需要用​​\​​转义。例如,正则表达式​​a\&c​​,其中​​\&​​是用来匹配特殊字符​​&​​的,它能精确匹配字符串​​"a&c"​​,但不能匹配​​"ac"​​、​​"a-c"​​、​​"a&&c"​​等。

要注意正则表达式在Java代码中也是一个字符串,所以,对于正则表达式​​a\&c​​来说,对应的Java字符串是​​"a\\&c"​​,因为​​\​​也是Java字符串的转义字符,两个​​\\​​实际上表示的是一个​​\​​:

如果想匹配非ASCII字符,例如中文,那就用​​\u####​​​的十六进制表示,例如:​​a\u548cc​​​匹配字符串​​"a和c"​​​,中文字符​​和​​​的Unicode编码是​​548c​​。

匹配任意字符

精确匹配实际上用处不大,因为我们直接用​​String.equals()​​就可以做到。大多数情况下,我们想要的匹配规则更多的是模糊匹配。我们可以用​​.​​匹配一个任意字符。

例如,正则表达式​​a.c​​中间的​​.​​可以匹配一个任意字符,例如,下面的字符串都可以被匹配:

  • ​"abc"​​,因为​​.​​可以匹配字符​​b​​;
  • ​"a&c"​​,因为​​.​​可以匹配字符​​&​​;
  • ​"acc"​​,因为​​.​​可以匹配字符​​c​​。

但它不能匹配​​"ac"​​、​​"a&&c"​​,因为​​.​​匹配一个字符且仅限一个字符。

匹配数字

用​​.​​可以匹配任意字符,这个口子开得有点大。如果我们只想匹配​​0​​~​​9​​这样的数字,可以用​​\d​​匹配。例如,正则表达式​​00\d​​可以匹配:

  • ​"007"​​,因为​​\d​​可以匹配字符​​7​​;
  • ​"008"​​,因为​​\d​​可以匹配字符​​8​​。

它不能匹配​​"00A"​​,​​"0077"​​,因为​​\d​​仅限单个数字字符。

匹配常用字符

用​​\w​​可以匹配一个字母、数字或下划线,w的意思是word。例如,​​java\w​​可以匹配:

  • ​"javac"​​,因为​​\w​​可以匹配英文字符​​c​​;
  • ​"java9"​​,因为​​\w​​可以匹配数字字符​​9​​;。
  • ​"java_"​​,因为​​\w​​可以匹配下划线​​_​​。

它不能匹配​​"java#"​​,​​"java "​​,因为​​\w​​不能匹配​​#​​、空格等字符。

匹配空格字符

用​​\s​​可以匹配一个空格字符,注意空格字符不但包括空格,还包括tab字符(在Java中用​​\t​​表示)。例如,​​a\sc​​可以匹配:

  • ​"a c"​​,因为​​\s​​可以匹配空格字符;
  • ​"a c"​​,因为​​\s​​可以匹配tab字符​​\t​​。

它不能匹配​​"ac"​​,​​"abc"​​等。

匹配非数字

用​​\d​​可以匹配一个数字,而​​\D​​则匹配一个非数字。例如,​​00\D​​可以匹配:

  • ​"00A"​​,因为​​\D​​可以匹配非数字字符​​A​​;
  • ​"00#"​​,因为​​\D​​可以匹配非数字字符​​#​​。

​00\d​​可以匹配的字符串​​"007"​​,​​"008"​​等,​​00\D​​是不能匹配的。

类似的,​​\W​​可以匹配​​\w​​不能匹配的字符,​​\S​​可以匹配​​\s​​不能匹配的字符,这几个正好是反着来的。

// regex

 Run

重复匹配

我们用​​\d​​可以匹配一个数字,例如,​​A\d​​可以匹配​​"A0"​​,​​"A1"​​,如果要匹配多个数字,比如​​"A380"​​,怎么办?

修饰符​​*​​可以匹配任意个字符,包括0个字符。我们用​​A\d*​​可以匹配:

  • ​A​​:因为​​\d*​​可以匹配0个数字;
  • ​A0​​:因为​​\d*​​可以匹配1个数字​​0​​;
  • ​A380​​:因为​​\d*​​可以匹配多个数字​​380​​。

修饰符​​+​​可以匹配至少一个字符。我们用​​A\d+​​可以匹配:

  • ​A0​​:因为​​\d+​​可以匹配1个数字​​0​​;
  • ​A380​​:因为​​\d+​​可以匹配多个数字​​380​​。

但它无法匹配​​"A"​​,因为修饰符​​+​​要求至少一个字符。

修饰符​​?​​可以匹配0个或一个字符。我们用​​A\d?​​可以匹配:

  • ​A​​:因为​​\d?​​可以匹配0个数字;
  • ​A0​​:因为​​\d?​​可以匹配1个数字​​0​​。

但它无法匹配​​"A33"​​,因为修饰符​​?​​超过1个字符就不能匹配了。

举报

相关推荐

0 条评论