我正在努力学习一堂课的正则表达式。我正在制作一个简单的HTML Lexer / Parser。我知道这不是制作Lexer / Parser的最佳或最有效的方法,但它只是了解Regex模式。
所以我的问题是,如何创建一个模式来检查String是否不包含任何HTML标记(即<TAG>
)并且不包含任何HTML实体(即&ENT;
)?< / p>
到目前为止,这是我能想到的,但它仍然不起作用:
.+?(^(?:&[A-Za-z0-9#]+;)^(?:<.*?>))
编辑:唯一的问题是我无法否定我需要找到一个完整模式的最终结果,如果可能的话,它将完成这项任务,尽管它可能并不漂亮。我从来没有提到,但它几乎应该匹配HTML页面中的任何简单文本。
答案 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 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 world" has HTML:
答案 1 :(得分:1)
如果您希望匹配不遵循模式的字符串,最简单的方法是匹配模式,然后否定测试结果。
<[^>]+>|&[^;]+;
与此模式匹配的任何字符串都将具有至少一个标记(如您所定义的)或实体(如您所定义)。所以你想要的字符串是与这种模式不匹配的字符串(它们没有标签或实体)。