当前位置: 首页 > 知识库问答 >
问题:

在Java 8中将表示<img>标记的字符串部分收集到列表中

佟寒
2023-03-14

有一个用例,其中我有一个长的String可以包含许多

我写了一个正则表达式(< code > "

如:

final String regex = "<img.*?\\\">";
final String string = "Hello World <img src=\"https://dummyimage.com/300.png/09f/777\"> \nMy Name <img src=\"https://dummyimage.com/300.png/09f/ff2\"> Random Text\nHello\nHello Random <img src=\"https://dummyimage.com/300.png/09f/888\"> \nMy Name <img src=\"https://dummyimage.com/300.png/09f/2ff\">adaad\n";
final String replace = "";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

final String result = matcher.replaceAll(replace); // Here, how can I collect all the image tags in a list

共有2个答案

江洲
2023-03-14

我们可以使用所谓的Lookaheads和Lookbehinds拆分给定的字符串(有关更多信息,请查看下面提供的参考):

>

  • (?

    <代码>(?

    public static final Pattern ANGLE_BRACKETS =
        Pattern.compile("(?<=.)(?=<)|(?<=>)(?=.)");
    

    通过使用这种模式,我们在左尖括号和右尖括号边界的空字符串上生成一个子字符串流。然后过滤代表有效图像标签的字符串。

    final String string = "Hello World <img src=\"https://dummyimage.com/300.png/09f/777\"> \nMy Name <img src=\"https://dummyimage.com/300.png/09f/ff2\"> Random Text\nHello\nHello Random <img src=\"https://dummyimage.com/300.png/09f/888\"> \nMy Name <img src=\"https://dummyimage.com/300.png/09f/2ff\">adaad\n";
    
    List<String> imageTags = ANGLE_BRACKETS.splitAsStream(string)
        .filter(str -> str.strip().matches("<img[^<]+>")) // verifying that a string is a valid image tag
        .toList();
            
    imageTags.forEach(System.out::println);
    
    • 关于前瞻和展望的信息

    联机演示链接

    在正则表达式中,你需要关心开头的尖括号

    public static final Pattern IMG_TAG = Pattern.compile("img[^<]+>");
    

    使用 Java 9 方法 Matcher.results(),我们可以创建一个 MatchResult 对象流,其中包含有关给定字符串中捕获的序列的信息。为了获得匹配的子字符串,我们可以使用 MatchResult.group()。

    final String string = "Hello World <img src=\"https://dummyimage.com/300.png/09f/777\"> \nMy Name <img src=\"https://dummyimage.com/300.png/09f/ff2\"> Random Text\nHello\nHello Random <img src=\"https://dummyimage.com/300.png/09f/888\"> \nMy Name <img src=\"https://dummyimage.com/300.png/09f/2ff\">adaad\n";
        
    List<String> imageTags = IMG_TAG.matcher(string).results() // Stream<MatchResult>
        .map(MatchResult::group)                               // Stream<String>
        .toList();
            
    imageTags.forEach(System.out::println);
    

    输出:

    <img src="https://dummyimage.com/300.png/09f/777">
    <img src="https://dummyimage.com/300.png/09f/ff2">
    <img src="https://dummyimage.com/300.png/09f/888">
    <img src="https://dummyimage.com/300.png/09f/2ff">
    

    联机演示链接

  • 韶硕
    2023-03-14

    您可以简单地这样做:

    final List<String> result = new ArrayList<>();
    while (matcher.find()) {
         result.add(matcher.group());
    }
    

    并摆脱最终的字符串替换 = “”;

     类似资料:
    • 在一个用例中,我有一个包含许多< code >的长字符串 我写了一个正则表达式(< code > " 例如:

    • 我想迭代一个对象列表。每个对象都包含一些对象的变量。更具体地说: 我的名单是: 所需的映射结构是:

    • 问题内容: 本质上,我想从文件中吸收一行文本,将字符分配给列表,并创建列表中所有单独字符的列表-列表列表。 此刻,我已经尝试过了: 这就是我所拥有的。我不太了解如何提取单个字符并将其分配给新列表。 我从文件中得到的行将类似于: 我想把它变成这个列表,每个单独的字符: 问题答案: 字符串是可迭代的(就像列表一样)。 我的意思是您确实想要这样的东西: 要么 要么 字符将包含文件中的所有字符。

    • 问题内容: 我正在尝试采用一个字符串,并将其附加到列表中包含的每个字符串中,然后使用完成的字符串创建一个新列表。例: 我尝试了循环,并尝试了列表理解,但这是垃圾。一如既往的任何帮助,不胜感激。 问题答案: 最简单的方法是使用列表理解: 请注意,我避免使用内置名称,因为那样会掩盖或隐藏内置名称,这非常不好。 另外,如果您实际上不需要列表,而只需要一个迭代器,则生成器表达式可能会更高效(尽管在短列表中

    • 例如,我有一个类包含name和surname字段。 我想从的中收集一个的(名字和姓氏都在一起),但似乎无法对每个列表使用两次map或无法对每个列表使用两次stream。 我做错了什么?

    • 我有超过15个字符串列表,每个列表包含几个不同的代码。每个列表包含一种特定类型的代码。我有一个输入代码,必须找出该输入代码属于哪个列表,并根据结果返回一个特定字符串。我用if,else if来做这个。下面是示例代码 每个列表如下所示:公共静态列表codeTypeOneList=新ArrayList(); (其他代码类型的类似列表) 有没有更好的方法来实现这一点?谢谢