如何为HTML简单文本制作正则表达式模式?

时间:2010-12-10 20:22:20

标签: java regex posix regex-negation

我正在努力学习一堂课的正则表达式。我正在制作一个简单的HTML Lexer / Parser。我知道这不是制作Lexer / Parser的最佳或最有效的方法,但它只是了解Regex模式。

所以我的问题是,如何创建一个模式来检查String是否不包含任何HTML标记(即<TAG>)并且不包含任何HTML实体(即&ENT;)?< / p>

到目前为止,这是我能想到的,但它仍然不起作用:

.+?(^(?:&[A-Za-z0-9#]+;)^(?:<.*?>))

编辑:唯一的问题是我无法否定我需要找到一个完整模式的最终结果,如果可能的话,它将完成这项任务,尽管它可能并不漂亮。我从来没有提到,但它几乎应该匹配HTML页面中的任何简单文本。

2 个答案:

答案 0 :(得分:2)

您可以使用表达式<.+?>|&.+?;来搜索匹配项,然后取消结果。

  • <.+?>首先说<然后是任何事情(一次或多次),然后是>
  • &.+?;首先说&然后是任何事情(一次或多次),然后是;

以下是ideone.com demo here的完整示例。

import java.util.regex.*;

public class Test {
    public static void main(String[] args) {
        String[] tests = { "hello", "hello <b>world</b>!", "Hello&nbsp;world" };
        Pattern p = Pattern.compile("<.+?>|&.+?;");
        for (String test : tests) {
            Matcher m = p.matcher(test);
            if (m.find())
                System.out.printf("\"%s\" has HTML: %s%n", test, m.group());
            else
                System.out.printf("\"%s\" does have no HTML%n", test);
        }
    }
}

<强>输出:

"hello" does have no HTML
"hello <b>world</b>!" has HTML: <b>
"Hello&nbsp;world" has HTML: &nbsp;

答案 1 :(得分:1)

如果您希望匹配不遵循模式的字符串,最简单的方法是匹配模式,然后否定测试结果。

<[^>]+>|&[^;]+;

与此模式匹配的任何字符串都将具有至少一个标记(如您所定义的)或实体(如您所定义)。所以你想要的字符串是与这种模式不匹配的字符串(它们没有标签或实体)。