正则表达式中的括号(`()`)有多种作用,主要用于分组和捕获。以下是括号的主要作用及其详细解释:
### 1. 分组(Grouping)
括号可以用来将正则表达式的一部分括起来,形成一个子表达式。这有助于控制匹配的优先级和范围。
#### 示例
```java
String regex = "(ab)+";
```
- `ab`作为一个整体被括起来,`+`表示匹配一个或多个`ab`。
### 2. 捕获组(Capturing Groups)
括号可以用来捕获匹配的子表达式(同时包含分组的作用),以便在后续处理中使用。捕获组可以被提取和引用。
#### 示例
```java
String input = "The price is 123 dollars and the tax is 45 cents.";
String regex = "(\\d+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String match = matcher.group(1); // 提取第一个捕获组
System.out.println("Matched: " + match);
}
```
- `\\d+`匹配一个或多个数字,括号将其捕获,`matcher.group(1)`提取第一个捕获组。
### 3. 非捕获组(Non-Capturing Groups)
非捕获组用于分组,但不捕获匹配的子表达式。非捕获组使用`(?:...)`语法。
#### 示例
```java
String input = "The price is 123 dollars and the tax is 45 cents.";
String regex = "(?:price is )\\d+ (?:dollars and the tax is )\\d+ (?:cents)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String match = matcher.group(); // 提取整个匹配
System.out.println("Matched: " + match);
}
```
- `(?:...)`表示非捕获组,不会捕获子表达式,但仍然可以用于分组和回溯引用。
### 4. 前向肯定断言(Positive Lookahead)
前向肯定断言使用`(?=...)`语法,表示匹配的子表达式后面必须跟着指定的子表达式。
#### 示例
```java
String input = "The price is 123 dollars and the tax is 45 cents.";
String regex = "\\d+(?= dollars)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String match = matcher.group(); // 提取匹配的子串
System.out.println("Matched: " + match);
}
```
- `(?= dollars)`表示匹配的数字后面必须跟着`dollars`。
### 5. 前向否定断言(Negative Lookahead)
前向否定断言使用`(?!)`语法,表示匹配的子表达式后面不能跟着指定的子表达式。
#### 示例
```java
String input = "The price is 123 dollars and the tax is 45 cents.";
String regex = "\\d+(?! dollars)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String match = matcher.group(); // 提取匹配的子串
System.out.println("Matched: " + match);
}
```
- `(?! dollars)`表示匹配的数字后面不能跟着`dollars`。
### 6. 后向肯定断言(Positive Lookbehind)
后向肯定断言使用`(?<=...)`语法,表示匹配的子表达式前面必须跟着指定的子表达式。
#### 示例
```java
String input = "The price is 123 dollars and the tax is 45 cents.";
String regex = "(?<=price is )\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String match = matcher.group(); // 提取匹配的子串
System.out.println("Matched: " + match);
}
```
- `(?<=price is )`表示匹配的数字前面必须跟着`price is`。
### 7. 后向否定断言(Negative Lookbehind)
后向否定断言使用`(?<!...)`语法,表示匹配的子表达式前面不能跟着指定的子表达式。
#### 示例
```java
String input = "The price is 123 dollars and the tax is 45 cents.";
String regex = "(?<!price is )\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String match = matcher.group(); // 提取匹配的子串
System.out.println("Matched: " + match);
}
```
- `(?<!price is )`表示匹配的数字前面不能跟着`price is`。
### 总结
- **分组**:用于控制匹配的优先级和范围。
- **捕获组**:用于提取匹配的子表达式。
- **非捕获组**:用于分组,但不捕获子表达式。
- **前向肯定断言**:匹配的子表达式后面必须跟着指定的子表达式。
- **前向否定断言**:匹配的子表达式后面不能跟着指定的子表达式。
- **后向肯定断言**:匹配的子表达式前面必须跟着指定的子表达式。
- **后向否定断言**:匹配的子表达式前面不能跟着指定的子表达式。
下一篇:计算虚拟化软件介绍
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传