Java 使用正则表达式匹配字符串中半角括号中间的所有内容
使用 Pattern 和 Matcher 匹配字符串中 () 之间的内容。示例代码如下:
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
System.out.println("==================== start ====================");
String ua = "Mozilla/5.0 (Linux; Android 11; M2102K1C Build/RKQ1.201112.002; wv) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/90.0.4430.210 " +
"Mobile Safari/537.36 hap/1.10/xiaomi org.hapjs.mockup/1.10.0.0 " +
"me.liujiajia.app.sample/1.3.1 ({\"packageName\":\"org.hapjs.mockup\"," +
"\"type\":\"other\",\"extra\":{}})";
Matcher matcher = Pattern.compile("(?<=\\()[^\\)]+").matcher(ua);
while (matcher.find()) {
String group = matcher.group();
System.out.println(group);
}
System.out.println("===================== end =====================");运行结果如下:
bash
==================== start ====================
Linux; Android 11; M2102K1C Build/RKQ1.201112.002; wv
KHTML, like Gecko
{"packageName":"org.hapjs.mockup","type":"other","extra":{}}
===================== end =====================正则表达式 (?<=\\()[^\\)]+ 可以分为三个部分:
bash
(?<=\\()[^\\)]+
|--1---||-2--|3|(?<=\\()[^\\)]+
各部分的详细说明:
(?<=\\()(?<=pattern)为 反向肯定预查,其对应的为 正向肯定预查(?=pattern),两者本身都不参与匹配,但是会作为匹配的一个边界,反向肯定预查 可以理解为 开始边界 ,正向肯定预查 则是 结束边界 。
这里是 反向肯定预查 ,也就是 开始边界 ,边界值为\\(,代表了一个半角左括号,也就是说从一个半角左括号开始匹配。[^\\)][]为 中括号表达式 ,只匹配处于正则表达式中该位置的单个字符,这里为\\)也就是半角右括号(其中\\是用来转义为\,再结合\)转义为半角右括号)^在 中括号表达式 种表示查找不在列表或范围内的所有字符,这里就是这种情况,表示匹配不为)的字符。++表示匹配前面的子表达式一次或多次,这里表示匹配不为)的多个字符,直到)出现。
综上,(?<=\\()[^\\)]+ 表示匹配从 ( 开始到第一个 ) 截至的中间的所有字符。从上面实例的打印结果可以看到成功的匹配到了三段。