【问题标题】:Test string in Servlet using regex使用正则表达式在 Servlet 中测试字符串
【发布时间】:2014-06-27 19:22:13
【问题描述】:

无效的转义序列(有效的是 \b \t \n \f \r \" \' \ ):

private final String doGetHtmlStringPartThree = "<td><input type=\"radio\" name=\"userInput\" value=\"\d.+\">\d / \d</td>";

双重转义被接受:

private final String doGetHtmlStringPartThree = "<td><input type=\"radio\" name=\"userInput\" value=\"\\d.+\">\\d / \\d</td>";

测试

private final String doGetHtmlStringPartOne = "<html><body><table>"
        + "<tr><td><h1>";
private final String doGetHtmlStringPartTwo = "</h1></td>"
        + "<form method=\"post\">"
        + "<input type=\"hidden\" name=\"randomDigitRange\" value=\"1\" />"
        + "<input type=\"hidden\" name=\"randomMathematicalOperator\""
        + " value=\"1\" /><input type=\"hidden\" name=\"fractionBoolean\""
        + " value=\"";

private final String doGetHtmlStringPartThree = "<td><input type=\"radio\" name=\"userInput\" value=\"\\d.+\">[0-9] / \\d</td>";

private final String doGetHtmlStringPartFour = "</tr><tr><td>"
        + "<input type=\"submit\" value=\"Submit\" "
        + "onclick='this.form.action=\"ToBeDefinedServlet\";' />"
        + "</td></tr></table></form></body></html>"
        + "<form action=\"/tobedefinedservlet\">"
        + "<input type=\"submit\" value=\"Home\"></form>";

@Test
public void testBooleanFractionTrue() throws IOException, ServletException {
    mockDoGet();

    assertEquals(expectedDoGetHtmlString("1 / 1 + 1 / 1", true),
            stringWriter.getBuffer().toString().trim());
}

public String expectedDoGetHtmlString(String assignment,
        Boolean fractionBoolean) {
    return doGetHtmlStringPartOne + assignment + doGetHtmlStringPartTwo
            + "" + fractionBoolean + "" + "\" />" + "\n"
            + doGetHtmlStringPartThree + "\n" + doGetHtmlStringPartFour;
}

正则表达式不起作用:

问题

如何使用正则表达式在 servlet 中测试字符串?

【问题讨论】:

  • .+ 将尽可能匹配任何内容。如果 dot-all 匹配到字符串的末尾,如果不匹配,则匹配到行尾。这是首先完成的,然后从末尾开始一次回溯 1 个字符,直到它与表达式的其余部分匹配。

标签: java regex string servlets tdd


【解决方案1】:
<td><input type="radio" name="userInput" value="(\d)+.(\d)+">(\d)+( ?\/? ?)(\d)+<\/td>

这个我认为是你正在寻找的正则表达式。你没有给我们任何例子来测试正则表达式。你当然需要转义java中的字符。

Example in Regexr here.

这是一个在 Java 中使用 this 来匹配字符串的示例:

public static void main(String[] args) throws Exception {

    String regex = "<td><input type=\"radio\" name=\"userInput\" value=\"(\\d)+.(\\d)+\">(\\d)+( ?\\/? ?)(\\d)+<\\/td>";
    String test = "<td><input type=\"radio\" name=\"userInput\" value=\"1.1\">112/2</td>";
    System.out.println("Does: " + test);
    System.out.println("Match: the regex pattern: " + regex);
    System.out.println("Answer: " + test.matches(regex));

}

这给了我输出:

Does: <td><input type="radio" name="userInput" value="1.1">112/2</td>
Match: the regex pattern: <td><input type="radio" name="userInput" value="(\d)+.(\d)+">(\d)+( ?\/? ?)(\d)+<\/td>
Answer: true

假设您正在尝试使用测试库(如 JUnit),您可以使用 assertTrue(boolean) 方法。从我上面的例子中,你可以使用:

assertTrue(test.matches(regex));

【讨论】:

  • 图中包含示例
  • 我更新了我的答案。如果您向我详细说明您的要求以及您尝试过的内容,会更容易。 “如何使用正则表达式测试 servlet 中的字符串?”是一个非常模糊的问题,但可以通过快速谷歌搜索来解决。您的问题似乎与您的正则表达式本身有关(我相信?)。此外,将示例放在代码括号中(而不是图像)使我们更容易提供帮助。我所看到的只是您在图像中比较的一小部分。
  • 我再次更新了我的答案,以展示如何在 Java 中使用此正则表达式匹配(包括如何正确转义字符)。如果这是您正在寻找的答案,或者我可以提供更多帮助,请告诉我。
  • 如果使用assertTrue,则提供的正则表达式计算为真,而assertEquals 计算为假。我将使用提供的正则表达式和assertTrue 代替assertEquals。这回答了这个问题。谢谢你。我会投票并接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
相关资源
最近更新 更多