正则表达式中括号的几类作用

zhidiantech · · 105 次点击 · · 开始浏览    
正则表达式中的括号(`()`)有多种作用,主要用于分组和捕获。以下是括号的主要作用及其详细解释: ### 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`。 ### 总结 - **分组**:用于控制匹配的优先级和范围。 - **捕获组**:用于提取匹配的子表达式。 - **非捕获组**:用于分组,但不捕获子表达式。 - **前向肯定断言**:匹配的子表达式后面必须跟着指定的子表达式。 - **前向否定断言**:匹配的子表达式后面不能跟着指定的子表达式。 - **后向肯定断言**:匹配的子表达式前面必须跟着指定的子表达式。 - **后向否定断言**:匹配的子表达式前面不能跟着指定的子表达式。
105 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传