Java JDK正则表达


  一、概述

  正则 抒发式是Java 解决字符串、文本的主要工具 。

  Java对正则 抒发式的 解决集中在以下两个两个类:

  java.util.regex.Matcher   模式类:用来 示意一个编译过的正则 抒发式 。

  java.util.regex.Pattern   匹配类:用模式匹配一个字符串所 抒发的 形象 后果 。

  (新版的Java Doc有解释 。)

   比方一个 方便例子:

  Java代码

  import java.util.regex.Matcher;

  import java.util.regex.Pattern;

  public class RegxOperator {

  /**

  * @param args

  */

  public static void main(String[] args) {

  // TODO Auto-generated method stub

  Pattern p = Pattern.compile("f(.+?)k");

  Matcher m = p.matcher("fckfkkfkf");

  while (m.find()) {

  String s0 = m.group();

  String s1 = m.group(1);

  System.out.println(s0 + "||" + s1);

  }

  System.out.println("---------");

  m.reset("fucking!");

  while (m.find()) {

  System.out.println(m.group());

  }

  Pattern p1 = Pattern.compile("f(.+?)i(.+?)h");

  Matcher m1 = p1.matcher("finishabigfishfrish");

  while (m1.find()) {

  String s0 = m1.group();

  String s1 = m1.group(1);

  String s2 = m1.group(2);

  System.out.println(s0 + "||" + s1 + "||" + s2);

  }

  System.out.println("---------");

  Pattern p3 = Pattern

  .compile("(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])");

  Matcher m3 = p3

  .matcher("1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900-01.01 1900 13 01 1900 02 31");

  while (m3.find()) {

  System.out.println(m3.group());

  }

  }

  }

  输出 后果:

  fck||c

  fkk||k

  ---------

  fuck

  finish||in||s

  fishfrish||ishfr||s

  ---------

  1900-01-01

  2007/08/13

  1900.01.01

  1900 01 01

  1900 02 31

  Java代码

  import java.util.regex.Matcher;

  import java.util.regex.Pattern;

  public class Test {

  public static void main(String args[]) {

  String rawDate = "1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900-01.01 1900 13 01 1900 02 31";

  String patternStr = "(\d{4})[- /.](\d{2})[- /.](\d{2})";

  Pattern pattern = Pattern.compile(patternStr);

  Matcher matcher = pattern.matcher(rawDate);

  while(matcher.find()){

  System.out.println("full date is " + matcher.group());

  System.out.println("year is " + matcher.group(1));

  System.out.println("month is " + matcher.group(2));

  System.out.println("date is " + matcher.group(3));

  }

  }

  }

  full date is 1900-01-01

  year is 1900

  month is 01

  date is 01

  full date is 2007/08/13

  year is 2007

  month is 08

  date is 13

  full date is 1900.01.01

  year is 1900

  month is 01

  date is 01

  full date is 1900 01 01

  year is 1900

  month is 01

  date is 01

  full date is 1900-01.01

  year is 1900

  month is 01

  date is 01

  full date is 1900 13 01

  year is 1900

  month is 13

  date is 01

  full date is 1900 02 31

  year is 1900

  month is 02

  date is 31

  二、一些方便迷糊的问题

  1、Java对反斜线 解决的问题

  在 其余语言中,示意要插入一个字符;

  在Java语言中,示意要插入正则 抒发式的反斜线,而且后面的字符有特别 意思 。

  看API文档:

   预约义字符类

  . 任何字符(与行 完毕符可能匹配也可能不匹配)

  d 数字:[0-9]

  D 非数字: [^0-9]

  s 空白字符:[ x0Bf ]

  S 非空白字符:[^s]

  w 单词字符:[a-zA-Z_0-9]

  W 非单词字符:[^w]

  然而看看上面程序,对照下不难看出:

  d在实际 使用的时候就写成了 \d;

  在Java正则 抒发式中,假如要插入一个字符,则需求在正则 抒发式中写成\\,缘由是下面的APIDoc定义示意一个反斜线 。

  然而假如在正则 示意式中 示意回车换行等,则不需求多增加反斜线了 。 比方回车 就写作 .

  字符

  x 字符 x

  \ 反斜线字符