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

Java 从字符串中搜索并提取具有特定关键字的字符串,java,regex,Java,Regex,我正在处理一个tsv文件。我在一个条目中有一堆url,我正在寻找一个带有“.ab.”关键字的特定url 这是我的数据: 我希望输出是 这就是我正在使用的:“^http://.[.AB.jpg]”但它提供了整个字符串。 我可以使用什么正则表达式 谢谢大家! 请注意,^http://.[.AB.jpg]匹配字符串开头的http://,*将除换行符以外的每个字符匹配到(行的)结尾,查找以下字符的最后一次出现时间-,A,B,,,,j,p,g。最后是g——因此整个字符串是匹配的 你可以用 http:\/\

我正在处理一个tsv文件。我在一个条目中有一堆url,我正在寻找一个带有“.ab.”关键字的特定url

这是我的数据:

我希望输出是

这就是我正在使用的:“^http://.[.AB.jpg]”但它提供了整个字符串。 我可以使用什么正则表达式


谢谢大家!

请注意,
^http://.[.AB.jpg]
匹配字符串开头的
http://
*
将除换行符以外的每个字符匹配到(行的)结尾,查找以下字符的最后一次出现时间-
A
B
j
p
g
。最后是
g
——因此整个字符串是匹配的

你可以用

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

正则表达式匹配:

  • http:\//
    -匹配
    http://
  • (?:(?!http:\/\/)*
    -匹配未启动子字符串的任何符号
    http://
    (从而确保第一个
    http://
    .ab.
    之间的最短窗口)
  • \.ab\.
    -literal
    .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));
}
报告的产出:

更换

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

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

简单的方法是排除逗号,但一般来说这是一种错误的方法,因为url可能包含逗号。因此,更好的方法是排除url开头的所有
h
字符:
[^h]*(?:(?:(?:\Bh|h(?!ttp:)[^h]*)*
。阅读
lookahead
s、字符类和正则表达式特殊字符。试试看。@Stribizev非常感谢您!成功了。我是一个新的正则表达式学习者。如果你能解释一下逻辑,那会很有帮助的。此外,我还观察到它无法检测多个事件。我还需要添加其他正则表达式吗?谢谢!!@Casimir et Hippolyte我的数据由不同的URL组成。url不包含“,”,但它们用逗号分隔。当我在java代码中测试时,我的正则表达式失败。你能告诉我哪里出了问题吗?Java代码:公共类RegexTry{public static void main(String[]args){Pattern Pattern=Pattern.compile((http:/(?:(!http:/))*.AB.(?:(!http:/)*(?=$| http)));String mydata=“”;Matcher Matcher=Pattern.Matcher(mydata);if(Matcher.Matcher()){System.out.println(Matcher.group(1));}}}我添加了一个Java实现。完美!!再次感谢@stribizhevFurther更多,我想返回原始字符串,不包括包含.ab的组(0)url。这就是我正在做的:while(matcher.find()){str.replace(matcher.group(0),“”);System.out.println(matcher.group(0));System.out.println(str);}但是替换操作没有正确执行。你能指导我吗?你只是忘了把替换的字符串赋回变量。而且你不需要任何匹配者。
str = str.replaceAll("(?i)http://(?:(?!http://).)*\\.ab\\.(?:(?!http://).)*(?=$|http)", "");