有关Java中的正则表达式的细则可以查阅JDK中的 java.util.regex 包中的 Pattern 类
一个正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称作正则表达式中的元字符。
例如:“ \\dcat ” 中的 \\d 就是有特殊意义的元字符,代表从 0 ~ 9 的任意一个数,“ \\dcat ” 能够匹配 0cat、1cat、2cat…9cat 字符串。
以下是常用的元字符及其意义:
元字符 | 在正则表达式中的写法 | 意义 |
---|---|---|
. | . | 代表任意一个字符 |
\d | \d | 代表 0 ~ 9 任意一个数字 |
\D | \D | 代表任何一个非数字字符 |
\s | \s | 代表空格类字符,如 “ \t ” " \n " " \x0B " " \f " " "\r " |
\S | \S | 代表非空格类字符 |
\w | \w | 代表可用于标识符的字符 |
\W | \W | 代表不能用于标识符的字符 |
\p{Lower} | \p{Lower} | 小写字母 [ a - z ] |
\p{Upper} | \p{Upper} | 大写字母 [ A - Z ] |
\p{ASCII} | \p{ASCII} | ASCII 字符 |
\p{Alpha} | \p{Alpha} | 字母 |
\p{Digit} | \p{Digit} | 数字字符 |
\p{Alnum} | \p{Alnum} | 字母或数字 |
\p{Punct} | \p{Punct} | 标点符号: !"#$%&*±,./:;<=>?@[]^_{}|~ |
\p{Graph} | \p{Graph} | 可视字符:相当于\p{Alnum}\p{Punct} |
\p{Print} | \p{Print} | 可打印字符:相当于\p{Graph} |
\p{Blank} | \p{Blank} | 空格或制表符 [ \t ] |
\p{Cntrl} | \p{Cntrl} | 控制字符:[ \x00-\xlF\x7F ] |
- 在正则表达式中:用方括号扩起若干个字符来表示一个元字符;
- 该元字符代表方括号中的任何一个字符;
- 例如:
- regex=“[168]ABC”;
- 代表着 “1ABC”、“6ABC”、“8ABC”
方括号元字符的意义如下:
[abc]:代表a、b、c中的任何一个
[^abc]:代表除了a、b、c以外的任何字符
[a-d]:代表a至d中的任何一个
[a-zA-Z]:代表英文字母中的任何一个
另外,中括号里还允许嵌套中括号,可以进行并、交、差运算:
[a-d[m-p]]:代表a至d,或m至p中的任何一个字符(并)
[a-z&&[def]]:代表d、e、f中的任何一个(交)
[a-f&&[^bc]]:代表a、d、e、f(差)
在正则表达式中,用 “ . ” 来表示任何一个字符:
如果想使用普通意义的点字符,必须使用[.]或\56表示
- 限定修饰符:
对于限定修饰符?,如果X代表正则表达式中的一个元字符或普通字符,则X?表示X出现0次或1次
例如
regex = "hello[2468]?";
表示:(出现0次或1次)
hello 、hello2 、hello4 、hello6 、hello8
带限定符号的模式 | 意义 |
---|---|
X? | X出现0次或1次 |
X* | X出现0次或多次 |
X+ | X出现1次或多次 |
X{n} | X恰好出现n次 |
X{n,} | X至少出现n次 |
X{n,m} | X出现n次到m次 |
XY | X后跟Y |
X|Y | X或Y |
例如:
regex = "\\w{4}";
表示:
abcd 天道酬勤 Java bird
下面举几个例子来深入理解:
- 判断用户从键盘输入的字符序列是否全部由英文字母所组成
import java.util.Scanner;
public class Example {
public static void main(String args[]) {
String regex = "[a-zA-Z]+"; //也可 [a-z-A-Z]
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
if(str.matches(regex)){
System.out.println(str+"中的字符都是英文字符");
}
}
}
- 字符串的替换
字符串调用方法:
public String replaceAll( String regex,String replacement )
方法返回一个字符串,该字符串是当前字符串中所有和参数 regex 指定的正则表达式匹配的子字符串被参数替换 replacement 指定的字符串替换后的字符串;
例如:
String result = "123hello456".replaceAll( "[a-zA-Z]+","你好" );
输出:
"123你好567"
replaceAll方法是返回一个字符串,而不改变当前字符串
- 字符串的分解
String类提供:
public String[] split( String regex );
字符串调用该方法时,使用参数指定的正则表达式 regex 作为分割标记,分解出其中的单词,并将分解出的单词存放在字符串数组中;
例如:
String str = "Who are you ?";
//空格、数字和符号组成的正则表达式
String regex = "[\\s\\d\\p{Punct}]+";
String words[] = str.split(regex);
for (String s:words) {
System.out.println("word:"+s);
}
运行结果: