【问题标题】:cut string between characters and doesn't remove those characters在字符之间剪切字符串并且不删除这些字符
【发布时间】:2015-01-29 11:16:18
【问题描述】:

这个问题很简单。我有以下字符串

String str1 = "<img alt=\"Рейтинг \" src=\"https://itvdn.blob.core.windows.net/images/images-bfa852f3-c227-46dd-86d7-2628f7338b0b.png\">";
String str2 = "<img class=\"w640\" id=\"customHeaderImage\" src=\"http://i067.radikal.ru/1412/23/c71d6e8e7d47.jpg\">";

我需要删除imgsrc 之间的字符串并保留它们。所以结果应该是这样的:

String str1 = "<img src=\"https://itvdn.blob.core.windows.net/images/images-bfa852f3-c227-46dd-86d7-2628f7338b0b.png\">";
String str2 = "<img src=\"http://i067.radikal.ru/1412/23/c71d6e8e7d47.jpg\">";

我已经试过了:

str1 = str1.replaceAll("(img)[^&]*(src)", "");
str2 = str2.replaceAll("img.*?src", "");

但它也会删除 imgsrc

目前我正在使用以下解决方案

String firstDelim = "img";
String secondDelim = "src";
int delim1 = str1.indexOf(firstDelim);
int delim2 = str1.indexOf(secondDelim);
if (delim1 >= 0 && delim2 > delim1) {
    str1= str1.substring(0, delim1 + firstDelim.length()) + " " + body.substring(delim2);
}

但我认为还有另一种方法。你能帮我解决这个问题吗?

【问题讨论】:

    标签: java android regex


    【解决方案1】:

    您可以为此使用“环视”:

    String str1 = "<img alt=\"Рейтинг \" src=\"https://itvdn.blob.core.windows.net/images/images-bfa852f3-c227-46dd-86d7-2628f7338b0b.png\">";
    String str2 = "<img class=\"w640\" id=\"customHeaderImage\" src=\"http://i067.radikal.ru/1412/23/c71d6e8e7d47.jpg\">";
    //                                  | preceded by "img"
    //                                  |       | any character, reluctantly quantified
    //                                  |       |   | followed by "src"
    //                                  |       |   |        | replace with 1 space
    System.out.println(str1.replaceAll("(?<=img).+?(?=src)", " "));
    System.out.println(str2.replaceAll("(?<=img).+?(?=src)", " "));
    

    输出

    <img src="https://itvdn.blob.core.windows.net/images/images-bfa852f3-c227-46dd-86d7-2628f7338b0b.png">
    <img src="http://i067.radikal.ru/1412/23/c71d6e8e7d47.jpg">
    

    注意

    使用正则表达式解析标记绝不是一个好主意。不过,在这种情况下,替换很简单。但要小心极端情况!

    【讨论】:

      【解决方案2】:

      确实很简单。你快到了:

      str1 = str1.replaceAll("(img)[^&]*(src)", "img src");
      

      【讨论】:

        【解决方案3】:
        (?<=\bimg\b).*?(?=\bsrc\b)
        

        试试这个。替换为space。查看演示。

        https://regex101.com/r/pM9yO9/23

        对于java来说是

         (?<=\\bimg\\b).*?(?=\\bsrc\\b)
        

        这里我们使用0 width assertions,而不是使用字符串本身。

        (?lookbehind to check string to be captured has img before it.

        (?=\bsrc\b) lookahead to see if string being captured has src ahead of it.

        【讨论】:

        • 谢谢,它有效。感谢您提供在线正则表达式检查器,不知道。
        • @MaxZavernutiy 是的,总是在那里玩正则表达式。它非常有用,有一天你会成为专业人士。
        【解决方案4】:

        谢谢大家,所有的答案都有效。不幸的是,我无法将所有答案都标记为正确。我正在使用System.out.println(str1.replaceAll("(?&lt;=img).+?(?=src)", " "));,所以将其标记为正确。 但我感谢大家的所有回答,他们真的很有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-01
          • 2022-11-23
          相关资源
          最近更新 更多