java吧 关注:1,214,578贴子:12,663,043
  • 2回复贴,共1

为什么我的正则表达式不能正确截取字符串?

只看楼主收藏回复

public static List<String> getString(String str,String star, String end){
Pattern pattern = Pattern.compile("(?<="+star+")(\\S+?)(?="+end+")");
Matcher matcher = pattern.matcher(str);
List<String> data = new ArrayList<String>();
while(matcher.find())
data.add(matcher.group());
return data;
}
public static List<String> getString(String str,String pre,String star, String end){
Pattern pattern = Pattern.compile("(?<="+star+")"+pre+"(?="+end+")");
Matcher matcher = pattern.matcher(str);
List<String> data = new ArrayList<String>();
while(matcher.find())
data.add(matcher.group());
return data;
}
public static void main(String[] args) {
String str = "<li>111111111zui2jun1111;"
+ "222222222</li>333<li>4444"
+ " 555555</li>666"
+ "777<li>8888"
+ " 9999"
+ "000</li>";
System.out.println(getString(str,"([\\s\\S]*)","<li>","</li>"));
String str2 = "<li>111</li><li>222</li><li>333</li>";
System.out.println(getString(str2,"<li>","</li>"));
}
结果:
[111111111zui2jun1111;222222222</li>333<li>4444 555555</li>666777<li>8888 9999000]
[111, 222, 333]
为什么第一个不能像第二个一样 把每个符合<li>开头</li>结尾的字符串给截取出来呢
我如果要达到第二个的效果 要怎么写正则表达式呢


IP属地:福建1楼2017-12-12 11:46回复
    要不你试试
    System.out.println(getString(str,"(.*?)","<li>","</li>"));


    IP属地:浙江2楼2017-12-12 14:04
    回复
      ?: 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
      所以其实你只要在*后面加个问号就行了
      另外我看你写[\\s\\S]*,还不如改成.*看的清爽


      IP属地:浙江3楼2017-12-12 14:13
      回复