Java 中的正则表达式

Java 中的正则表达式


2019-04-10

正则表达式

常规引用方式

表达式 解释
. 匹配所有字符
^regex 必须从行首开始匹配
regex$ 最后必须匹配行尾
[abc] 字符组定义,必须匹配 a 或 b 或 c
[abc][vz] 字符组定义,必须匹配 第一位:a 或 b 或 c ,第二位 v 或 z
[^abc] 字符组中以 ^ 开始,表示排除模式
[a-d1-7] 字符组范围
X竖线Z X 或 Z
XZ X 紧邻 Z
$ 行尾

字符组 (character class/set)

正则表达式将中括号 [] 视为**元字符 (metacharacter)**,元字符不参与匹配。

中括号内的字符,如 [0-9] 叫做字符组,表示一些被匹配的字符集。

字符组简写式

表达式 解释
\d [0-9]
\D [^0-9]
\s [\t\n\x0b\r\f]
\S 非空白字符
\w [a-zA-Z_0-9]
\W [^\w]
\b 匹配单词边界(vim中使用 \< \>

量词

表达式 解释
* {0,}
+ {1,}
? {0,1}.
{X} X times
{X,Y} Occurs between X and Y times,

分组和后项引用

小括号可以分组、$1之类的可以在捕获后在后面引用,如:

1
2
3
// 移除两个单词之间的空格
String pattern = "(\\w)(\\s+)([\\.,])";
System.out.println(EXAMPLE_TEST.replaceAll(pattern, "$1$3"));

反前瞻(《学习正则表达式》中的翻译,原文是:Negative look ahead):

1
a(?!b)

a 后面不跟着 b。

正则表达式中的模式:

  • (?i) 忽略大小写

  • (?s) 单行模式

  • (?m) 多行模式

转义字符

反斜杠是Java字符串中的转义字符。这意味着反斜杠在Java中具有预先定义的含义。必须使用双反斜杠 \ 定义一个反斜杠。如果要定义 \w,则必须在regex中使用 \w。如果要使用反斜杠作为文本,则必须在正则表达式中键入 \\ 作为转义符。

在String 方法中使用正则表达式

String 中提供了正则表达式的方法,如: matches(), split()), replaceFirst()replaceAll() 方法.,replace() 方法不支持正则表达式。

方法 解释
s.matches("regex") s 是否完全匹配 regex
s.split("regex") 使用 regex 分割 s ,返回一个数组
s.replaceFirst("regex"), "replacement" 使用 "replacement 替换掉第一个 "regex"
s.replaceAll("regex"), "replacement" 使用 "replacement 替换掉所有 "regex"

Pattern and Matcher

对于高级正则表达式,可以使用 java.util.regex.Pattern 和 java.util.regex.Matcher 类。
首先创建一个 Pattern 对象,该对象定义正则表达式。此模式对象允许您为给定的字符串创建 Matcher 对象。然后使用这个对象对字符串执行 regex 操作,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTestPatternMatcher {
public static final String EXAMPLE_TEST = "This is my small example string which I'm going to use for pattern matching.";

public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\w+");
// in case you would like to ignore case sensitivity,
// you could use this statement:
// Pattern pattern = Pattern.compile("\\s+", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(EXAMPLE_TEST);
// check all occurance
while (matcher.find()) {
System.out.print("Start index: " + matcher.start());
System.out.print(" End index: " + matcher.end() + " ");
System.out.println(matcher.group());
}
// now create a new pattern and matcher to replace whitespace with tabs
Pattern replace = Pattern.compile("\\s+");
Matcher matcher2 = replace.matcher(EXAMPLE_TEST);
System.out.println(matcher2.replaceAll("\t"));
}
}