Java 正则表达式

1.Java 正则表达式  java.util.regex 

  Matcher (匹配器类) 真正影响搜索的对象

  Pattern (模式类) 用来表达和陈述所要搜索模式对象

  Pattern p = Pattern.compile("a*b");

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

  boolean b = m.matches();

 

   boolean b = Pattern.matches("a*b", "aaaaab");


  boolean matches()  Pattern匹配整个字符串

  boolean lookingAt() Pattern匹配字符串的开头

  boolean find()  发现CharSequence里的,与pattern相匹配的多个字符序列

  boolean find(int start)

Characters

x   The character x  字符X

\\   The backslash character  反斜杠

\t   The tab character ('\u0009') 制表符Tab

\n   The newline (line feed) character ('\u000A') 换行符 

\r   The carriage-return character ('\u000D')  回车符

\f   The form-feed character ('\u000C') 换页符

Character classes

[abc]   a, b, or c (simple class)  匹配字符三者中的某一个

[^abc]   Any character except a, b, or c (negation) 匹配的字符不包含abc这三个字符任意一个

[a-zA-Z]    a through z or A through Z, inclusive (range)匹配字符是小写字母a-z任意一个或者大写字母A-Z任意一个

[a-d[m-p]]   a through d, or m through p: [a-dm-p] (union) 等价于[a-dm-p]

[a-e&&[def]]   d, e, or f (intersection) 匹配 d,e,f 之中的一个 并且 在a-e的范围内

[a-z&&[^bc]]   a through z, except for b and c: [ad-z] (subtraction) 等价 [ad-z]  在a-z的范围内排除bc

[a-z&&[^m-p]]  a through z, and not m through p: [a-lq-z](subtraction) 等价 [a-lq-z]

 

Predefined character classes

.  Any character (may or may not match line terminators) 任意字符 可能有或者没有

\d  A digit: [0-9] 数字0-9 

\D  A non-digit: [^0-9] 边界  不是数字

\s  A whitespace character: [ \t\n\x0B\f\r] 空白字符

\S  A non-whitespace character: [^\s] 不是空白字符

\w  A word character: [a-zA-Z_0-9]  单词 匹配a-zA-Z 或者_或者0-9

\W  A non-word character: [^\w] 不是单词


^  The beginning of a line  如^abc 以字符串abc开头

$  The end of a line  $abc  以字符串abc结尾


反斜线、转义和引用

 反斜线字符 ('\') 用于引用转义构造,如上表所定义的, 同时还用于引用其他将被解释为非转义构造的字符。因此, 表达式 \\ 与单个反斜线匹配,而 \{ 与左括号匹配。

在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。

根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。

因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。

String num  = "\\string";

System.out.println(num);

Pattern pn = Pattern.compile("\\\\string");

System.out.println(pn.toString());

System.out.println(pn.matcher(num).matches());

\string

\\string

  true

String num  = "\\string";

System.out.println(num);

Pattern pn = Pattern.compile("\\string");

System.out.println(pn.toString());

System.out.println(pn.matcher(num).matches());

\string

\string

false

匹配字符串\string

正常情况下 正则表达式为 \string 

在正则表达式中\ 用于引用转义构造,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式 \\ 与单个反斜线匹配,而 \{ 与左括号匹配。因此应该改为 \\string

在java 中 字符串\\string 应该定义的字符串常量为 \\\\string  这样编译器才能认为这个字符串合法。

X?    X, once or not at all X 出现一次或者不出现

X*    X, zero or more times  出现0或者多次

X+    X, one or more times  出现1次或者多次

X{n}   X, exactly n times  出现n次

X{n,}   X, at least n times  出现至少n

X{n,m}   X, at least n but not more than m times 出现至少n次但是不多于m次

String num  = "stresss";

System.out.println(num);

Pattern pn = Pattern.compile("s*tres{2,4}");

System.out.println(pn.toString());

System.out.println(pn.matcher(num).matches());

stresss

s*tres{2,4}

true

Groups

Group是指里用括号括起来的,能被后面的表达式调用的正则表达式。Group 0 表示整个表达式,group 1表示第一个被括起来的group,以此类推。所以

A(B(C))D

里面有三个group:group 0是ABCD, group 1是BC,group 2是C。

你可以用下述Matcher方法来使用group:

public int groupCount( )返回matcher对象中的group的数目。不包括group0。

public String group( ) 返回上次匹配操作(比方说find( ))的group 0(整个匹配)

public String group(int i)返回上次匹配操作的某个group。如果匹配成功,但是没能找到group,则返回null。

public int start(int group)返回上次匹配所找到的,group的开始位置。

public int end(int group)返回上次匹配所找到的,group的结束位置,最后一个字符的下标加一。


public Matcher appendReplacement(StringBuffer sb,String replacement)

  • 实现非终端追加和替换步骤。

    此方法执行以下操作:

    替换字符串可能包含到以前匹配期间所捕获的子序列的引用:$g 每次出现时,都将被 group(g) 的计算结果替换。$ 之后的第一个数始终被视为组引用的一部分。如果后续的数可以形成合法组引用,则将被合并到 g 中。只有数字 '0' 到 '9' 被视为组引用的可能组件。例如,如果第二个组匹配字符串 "foo",则传递替换字符串 "$2bar" 将导致 "foobar" 被追加到字符串缓冲区。可能将美元符号 ($) 作为替换字符串中的字面值(通过前面使用一个反斜线 (\$))包括进来。

    注意,在替换字符串中使用反斜线 (\) 和美元符号 ($) 可能导致与作为字面值替换字符串时所产生的结果不同。美元符号可视为到如上所述已捕获子序列的引用,反斜线可用于转义替换字符串中的字面值字符。

    此方法设计用于循环以及 appendTail  find 方法中。例如,以下代码将 one dog two dogs in the yard 写入标准输出流中:

     Pattern p = Pattern.compile("cat");
     Matcher m = p.matcher("one cat two cats in the yard");
     StringBuffer sb = new StringBuffer();
     while (m.find()) {
         m.appendReplacement(sb, "dog");
     }
    1. 它从追加位置开始在输入序列读取字符,并将其追加到给定字符串缓冲区。在读取以前匹配之前的最后字符(即位于索引 start() - 1 处的字符)之后,它就会停止。

    2. 它将给定替换字符串追加到字符串缓冲区。

    3. 它将此匹配器的追加位置设置为最后匹配位置的索引加 1,即 end()



      • 参数:

      • sb - 目标字符串缓冲区。

      • replacement - 替换字符串。

      • 返回:

      • 匹配器。

      • 抛出:

      • IllegalStateException - 如果没有尝试任何匹配,或者以前的匹配操作失败。

      • IndexOutOfBoundsException - 如果替换字符串引用模式中不存在的捕获组。


    美元符号可视为到如上所述已捕获子序列的引用,反斜线可用于转义替换字符串中的字面值字符。


    你可能感兴趣的:(Java 正则表达式)