2026-10-30 16:27:39
使用正则表达式 (?<=【).*?(?=】) 可提取【】括号中的内容。该表达式通过零宽断言定位匹配范围,结合懒惰量词确保精准提取,具体解析如下:
正则表达式结构解析(?<=【)正向回顾后发断言(零宽断言),匹配【之后的位置,不包含【本身。作用是限定匹配起始点必须紧跟在【后。
.*?
. 匹配任意字符(除换行符外)。
*? 懒惰量词,匹配尽可能少的字符,确保只提取到第一个】前的内容。若用贪婪量词 *,可能匹配到最后一个】导致错误。
(?=】)正向预查断言(零宽断言),匹配】之前的位置,不包含】本身。作用是限定匹配结束点必须在】前。
以字符串 "1【2】3【456】78" 为例,使用以下代码提取内容:
const exp = /(?<=【).*?(?=】)/g;const str = '1【2】3【456】78';const result = str.match(exp);console.log(result); // 输出: ['2', '456']第一次匹配:从第一个【后开始,到第一个】前结束,提取 "2"。
第二次匹配:从第二个【后开始,到第二个】前结束,提取 "456"。
最终结果数组为 ['2', '456']。
浏览器兼容性
零宽断言((?<=...) 和 (?=...))在部分旧版浏览器(如IE)中不支持。若需兼容,可改用捕获组方案:const exp = /【(.*?)】/g;const str = '1【2】3【456】78';const result = [];let match;while ((match = exp.exec(str)) !== null) { result.push(match[1]); // 提取第一个捕获组内容}console.log(result); // 输出: ['2', '456']
嵌套括号问题
若字符串中存在嵌套括号(如 "【a【b】c】"),上述正则表达式会匹配到错误内容(如 "a【b")。此时需更复杂的正则或解析逻辑。
多行文本处理
默认情况下,. 不匹配换行符。若需跨行匹配,可添加 s 修饰符(部分语言支持,如JavaScript需通过 [sS] 替代 .):// 跨行匹配方案(JavaScript)const exp = /【([sS]*?)】/g;
Python
import restr = "1【2】3【456】78"result = re.findall(r'(?<=【).*?(?=】)', str)print(result) # 输出: ['2', '456']Java
import java.util.regex.*;public class Main { public static void main(String[] args) { String str = "1【2】3【456】78"; Pattern pattern = Pattern.compile("(?<=【).*?(?=】)"); Matcher matcher = pattern.matcher(str); while (matcher.find()) { System.out.println(matcher.group()); // 依次输出: 2, 456 } }}通过上述方法,可高效提取【】括号中的内容,并根据实际需求调整正则表达式以适应不同场景。