使用Java Pattern和Matcher提取URL时多余字符问题求助
问题分析与解决
问题原因
你写的正则表达式https?:\\S+[^\");]没能排除末尾的");",核心问题出在\\S+上:
\\S匹配任意非空白字符,而")"和";"都属于非空白字符,所以\\S+会直接把URL后面的");"也包含进去- 后面的
[^\");]是试图再匹配一个不属于");的字符,但这步是在\S+`匹配完成之后执行的,根本没法回溯去掉已经匹配到的");"
修正后的正则与代码
把正则改成用正向预查来限定URL的结束位置,确保只匹配到");之前的内容:
public static String extractUrl(String str){ String url= ""; // 用正向预查(?=[");])匹配到");之前的内容,不包含这些结束符 Pattern pattern = Pattern.compile("https?:\\S*?(?=[\");])"); Matcher matcher = pattern.matcher(str); if(matcher.find()) { url = matcher.group(0); System.out.println("Media services URl is :\n "+ url); log.info("Media services URl is :\n {}", url); } return url; }
正则说明
https?:匹配http或https开头\\S*?非贪婪匹配任意非空白字符,*?表示尽可能少匹配,直到遇到后面的限定条件(?=[");])正向预查,匹配到"、)或;之前的位置,这些结束符不会被包含在匹配结果里
内容的提问来源于stack exchange,提问作者Alferd Nobel
相关产品推荐
相关产品推荐

