删除Java字符串中给定模式的表行

Posted

技术标签:

【中文标题】删除Java字符串中给定模式的表行【英文标题】:Remove table rows for given pattern in Java String 【发布时间】:2018-09-10 17:55:31 【问题描述】:

我想删除所有具有 N/A 的行,因为值是给定 html 代码(java 字符串)的最后一列。

请帮助我获取正确的正则表达式/模式代码以删除所有出现的情况:

<table class="overviewTable">
    <tr>
    <th colspan="6" class="header suite">
      <div class="suiteLinks">
                                        <a href="suite1_groups.html">Groups</a>
              </div>
      Test Automation
    </th>
  </tr>
  <tr class="columnHeadings">
    <td>&nbsp;</td>
    <th>Duration</th>
    <th>Passed</th>
    <th>Skipped</th>
    <th>Failed</th>
    <th>Pass Rate</th>
  </tr>
    
    <tr class="test">
    <td class="test">
      <a href="suite1_test14_results.html">Test Xyz</a>
    </td>
    <td class="duration">
      0.000s
    </td>

        <td class="zero number">0</td>
    
        <td class="zero number">0</td>
    
        <td class="zero number">0</td>
    
    <td class="passRate">
            N/A
          </td>
  </tr>
    
    <tr class="test">
    <td class="test">
      <a href="suite1_test15_results.html">Test abc XYZ</a>
    </td>
    <td class="duration">
      0.000s
    </td>

        <td class="zero number">0</td>
    
        <td class="zero number">0</td>
    
        <td class="zero number">0</td>
    
    <td class="passRate">
            N/A
          </td>
  </tr>
      
    <tr class="test">
    <td class="test">
      <a href="suite1_test17_results.html">TestAbcSuccess</a>
    </td>
    <td class="duration">
      77.582s
    </td>

        <td class="passed number">1</td>
    
        <td class="zero number">0</td>
    
        <td class="zero number">0</td>
    
    <td class="passRate">
            100%
          </td>
  </tr>
    
    <tr class="suite">
    <td colspan="2" class="totalLabel">Total</td>

        <td class="passed number">1</td>
    
        <td class="zero number">0</td>
    
        <td class="zero number">0</td>
    
    <td class="passRate suite">
            100%
          </td>

  </tr>
</table>

这是Java+Selenium+TestNG自动化结果的index.html文件。

请帮助我获取正确的正则表达式/模式代码以从上述 HTML 中删除所有出现。

这些是我的试验:

1.

fullHtmlStr = fullHtmlStr.replaceAll("(?<=<tr class=\"test\">).*?(?=N/A\n          </td>)", "");

2.

Pattern PATTERN = Pattern.compile("<tr class=\"test\">.*$.N/A\n          </td>", Pattern.MULTILINE | Pattern.DOTALL );
Matcher m = PATTERN.matcher(fullHtmlStr);
if (m.find())
   fullHtmlStr = m.replaceAll("");

(我对正则表达式一无所知,所以请原谅我以防万一这些完全错误)

附上截图:

更新前的截图:

更新后的截图:

【问题讨论】:

@mplungjan - 它与 selenium 无关,只是假设它是纯 Java 代码。 @DebanjanB - 我已经更新了上面的试验。谢谢。 @MukeshRajput remove all the rows having N/A 从哪里来? @DebanjanB - 我在我的 java 代码中将上面附加的 HTML 代码读取为字符串,现在我想操作这个字符串,以便从字符串中删除所有包含 N/A 的行。 您确定只删除 所有包含 N/A 的行 就足以满足您的需要,因为 String 操作 HTML DOM i> 不会保留 DOM 结构? 【参考方案1】:

我不鼓励您使用正则表达式来执行此操作:正则表达式可用于匹配由字符组成的模式,但不能匹配由模式组成的模式。

要处理一个 HTML 字符串,您需要一个合适的解析器:如果它是 XHTML,您可以通过 DocumentBuilder 直接解析它。如果没有,则需要先通过开源库 Tidy 将其转换为 XHTML。

通过解析器,您将 HTML 字符串转换为 Document 对象,您将对其进行处理以遍历它、添加或删除任何节点。

【讨论】:

感谢@little-santi 的想法。【参考方案2】:

根据@little-santi 的建议,我使用了jsoup html 解析器来操作代码,这是我的代码:

            Document document = Jsoup.parse(strText);
            for( org.jsoup.nodes.Element element : document.select("td:eq(5)")) 
                String content = element.getElementsMatchingOwnText("N/A").text();
                if(content.equalsIgnoreCase("N/A")) 
                    element = element.parent();
                    element.remove();
                
            
            strText = document.toString();

【讨论】:

以上是关于删除Java字符串中给定模式的表行的主要内容,如果未能解决你的问题,请参考以下文章

Java如何从文件中打印与给定模式匹配的所有字符串?

如何在java中获取给定的日期字符串格式(模式)?

jQuery选择器删除满足两个条件的表行

html 在javascript中删除不包括表头的表行

java编程 从键盘输入一个字符串和一个字符 从该字符串中删除给定的字符

如何删除特定类的表行? [关闭]