从字符串中搜索并提取具有特定关键字的字符串

时间:2015-09-11 22:46:19

标签: java regex

我正在处理一个tsv文件。我在一个条目中有一堆网址,我正在寻找一个具有' .ab。'的特定网址。关键字在其中。

这是我的数据:http://this/is/anexample.jpg,http://this/is/anexample.jpg,http://this/is/anexample.jpg,http://this/is/anexample.jpg,http://this/is/anexamplewith.AB.jpg

我希望输出为http://this/is/anexamplewith.ab.jpg

这就是我正在使用的:' ^ http://.* [.AB.jpg]'但是它给了我整个字符串。 我可以使用什么RegEx?

谢谢!

1 个答案:

答案 0 :(得分:1)

请注意,^http://.*[.AB.jpg]匹配字符串开头的http://.*匹配除换行符之外的所有字符(行的末尾),以查找最后一次出现的以下字符 - .AB.jpg。最后你有g - 因此匹配整个字符串。

您可以使用

http:\/\/(?:(?!http:\/\/).)*\.ab\.(?:(?!http:\/\/).)*(?=$|http)

请参阅demo

正则表达式匹配:

  • http:\/\/ - 匹配http://
  • (?:(?!http:\/\/).)* - 匹配任何未启动子字符串http://的符号(从而确保第一个http://.ab.之间的最短窗口)
  • \.ab\. - 文字.ab.
  • (?:(?!http:\/\/).)* - 见上文
  • (?=$|http) - 一个前瞻,告诉引擎停在字符串末尾($)或http://前面。

Java实现:

String str = "http://this/is/anexample.jpg,http://this/is/anexample.jpg,http://this/is/anexample.jpg,http://this/is/anexample.jpg,http://this/is/anexamplewith.AB.jpg";
Pattern ptrn = Pattern.compile("(?i)http://(?:(?!http://).)*\\.ab\\.(?:(?!http://).)*(?=$|http)");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(0));
}

sample demo program的输出:

http://this/is/anexamplewith.AB.jpg

<强> REPLACEMENT

要替换该匹配,您只需使用replaceAll

str = str.replaceAll("(?i)http://(?:(?!http://).)*\\.ab\\.(?:(?!http://).)*(?=$|http)", "");