【问题标题】:How apply foreach loop for every line of string如何为每一行字符串应用 foreach 循环
【发布时间】:2013-11-24 07:29:55
【问题描述】:

我有一个字符串:

  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
  <li>Milk</li>
  <li>Milk</li>
  <li>Milk</li>
  <li>Milk last</li>

我想对所有的 li-tags 进行交互(以便在标签之间添加一些文本):

    for (char c: innerText.toCharArray()) {

        if(c == '<'){
            // process the text but in this way 
           //I iterate over whole text as a one line
        }
    }

【问题讨论】:

  • 你想要内容还是标签?
  • 这是 HTML 吗?可以在客户端进行处理吗?
  • 是的,它是简单的 html,它是一个独立的应用程序。

标签: java loops foreach iteration


【解决方案1】:

如果您不想使用解析器,可以使用正则表达式,如下所示:

String regex = "<li>((?:\\w|\\s)+)</li>";
String list = "..."; //your list

Matcher m = Pattern.compile(regex).matcher(list);

while (m.find()) 
{
    String ofInterest = m.group(1);
    //doSomething
}

((?:\\w|\\s)+) 是一个捕获组,它从[A-Za-z_0-9] 或任何空格中获取字符,其中+ 表示必须至少有一个字符。如果两者之间没有字符,请改用*

m.group(1) 只是提取&lt;li&gt;&lt;/li&gt; 之间的内容,其中1 与第一个捕获组对应。

您可以将捕获组中的内容替换为您认为有效的内容。

这是Regular Expressions 的教程。祝你好运!

【讨论】:

  • 谢谢大家,stackoverflow 很棒! ! !
  • @MrPhi 很高兴我能帮上忙。如果您还不知道正则表达式,我强烈建议您阅读本教程。他们对很多任务都非常有帮助。祝你好运!
  • 没错,我的文本处理有问题,我不知道什么时候使用DOM,什么时候使用SAX,什么时候使用RegEX,有很多可能性,很容易迷失在其中。这个问题只是要解决的更大问题的一部分,现在多亏了问答,我找到了我应该走的路。再次感谢你们!
  • 您能否给我一个提示,您的解决方案是否最适合我的主要问题:stackoverflow.com/questions/19903402/…
  • @MrPhi 我快晕过去了,不知道是不是我太累了,但我不完全确定你的另一个问题在问什么。
【解决方案2】:

试试下面的代码:

String text = "<li>Coffee</li><li>Tea</li><li>Milk</li><li>Milk</li><li>Milk</li><li>Milk</li><li>Milk last</li>";
    text = text.replaceAll("</li>", "");
    String[] results = text.split("<li>");
    // The first one is empty, remove it
    for (int i = 1; i < results.length; i++) {
        System.out.println(results[i]);
    }

控制台输出如下:

Coffee
Tea
Milk
Milk
Milk
Milk
Milk last

【讨论】:

    【解决方案3】:

    试试这个

    String str ="<li>Coffee</li><li>Tea</li><li>Milk</li><li>Milk</li><li>Milk</li><li>Milk</li><li>Milk last</li>";
        String[] temp =str.replaceAll("</li>", "").split("<li>");
        String result ="";
        for (String value: temp){
            result = result + "<li>";
            // update the value here if needed
            result = result + value;        
            result = result+ "<li>";
        }
    
    
         System.out.println(result);
    

    【讨论】:

      【解决方案4】:

      试试:

          String str
                  = "<li>Coffee</li>"
                  + "<li>Tea</li>"
                  + "<li>Milk</li>"
                  + "<li>Milk</li>"
                  + "<li>Milk</li>"
                  + "<li>Milk</li>"
                  + "<li>Milk last</li>";
         String[] products= str.substring(4, str.length()-5).split("</li><li>");
          for (String prod : products) {
              System.out.println(prod);  
          }
      

      输出:

      Coffee
      Tea
      Milk
      Milk
      Milk
      Milk
      Milk last
      

      【讨论】:

        【解决方案5】:

        它表明你正在解析一些 html 元素, jsoup 是伟大的 java html 解析器之一,

        http://jsoup.org/cookbook/extracting-data/selector-syntax

        【讨论】:

        • 是的,你说得对,但我不想从某些框架中使用,我想最大限度地抓住Java ;-)
        【解决方案6】:

        使用JSoup 解析HTML 文本或使用DOM parser 解析XML 字符串。然后您可以将解析后的值传递给 for-each 循环。

        【讨论】:

          【解决方案7】:

          由于 OP 想要 add some text between the tags 我建议他使用 jquery 而不是服务器端解决方案。

          $( "li" ).each(function( index ) {
            str = $(this).text();
            $(this).text(str + " Other text");
           });
          

          【讨论】:

          • 什么是 OP?谢谢,但它是独立的应用程序。
          • OP = 原始海报的缩写。用于在线留言板和论坛。
          【解决方案8】:

          这一切都可以在一行中完成:

          for (String option : innerText.replaceAll("^.*?<li>|</li>.*?$", "").split("</li>\\s*<li>")) {
             System.out.println(option);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-08-13
            • 2020-01-14
            • 1970-01-01
            • 1970-01-01
            • 2015-02-13
            • 2013-11-25
            • 2015-02-06
            • 1970-01-01
            相关资源
            最近更新 更多