(?<=exp) 也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
例如:(?<=\bdanc)\w+\b 查找 I’m dancing,它会匹配 ing
(?=exp) 也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp
例如:\b\w+(?=ing\b) 查找 I’m dancing,它会匹配 danc
/**
* 这需要运用零宽断言<br>
* ?<=不包含左边值<br>
* ?=不包含右边值<br>
* \b 匹配一个字边界,即字与空格间的位置<br>
* (?=exp) 也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp 例如:\b\w+(?=ing\b) 查找 I'm dancing,它会匹配 danc <br>
* (?<=exp) 也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp 例如:(?<=\bdanc)\w+\b 查找 I'm dancing,它会匹配 ing <br>
*/
public class RegexUtil {
/**
* 正则表达式匹配文本内容
* @param text 需要查找的内容
* @param regex 配置正则表达式
* @return 匹配到的内容列表
*/
public static List<String> getList(String text, String regex) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
List<String> list = new ArrayList<>();
while (matcher.find()) {
String group = matcher.group();
list.add(group);
}
return list;
}
}
@Test
public void test01() {
String text = "Pingpong, I'm singing while you're dancing.";
String regex = "\\b\\w+(?=ing\\b)ing";
List<Object> targetList = Arrays.asList(new String[]{"singing", "dancing"});
Assert.isTrue(RegexUtil.getList(text, regex).equals(targetList), "两个List应该相等");
}
@Test
public void test02() {
String text = "Pingpong, I'm singing while you're dancing.";
String regex = "sing(?<=\\bsing)\\w+\\b";
List<Object> targetList = Arrays.asList(new String[]{"singing"});
Assert.isTrue(RegexUtil.getList(text, regex).equals(targetList), "两个List应该相等");
}
@Test
// 匹配 ()里面的内容
public void test03() {
String text = "北京市(海定区)(朝阳区)(西城区)";
String regex = "(?<=\\().*?(?=\\))";
List<Object> targetList = Arrays.asList(new String[]{"海定区", "朝阳区", "西城区"});
Assert.isTrue(RegexUtil.getList(text, regex).equals(targetList), "两个List应该相等");
}
@Test
public void test04() {
String text = "<string>小帅</string>";
String regex = "(?<=\\<string\\>).*?(?=\\</string\\>)";
List<Object> targetList = Arrays.asList(new String[]{"小帅"});
Assert.isTrue(RegexUtil.getList(text, regex).equals(targetList), "两个List应该相等");
}