我们需要匹配用户输入中的文字,但明确拒绝任何不是<br>
的标记。
从其他stackoverflow帖子中我可以找到与我需要的相反的匹配(即它匹配违规标签而不是文本和其他标签)。由于约束,我们不能使用负逻辑进行验证。正则表达式是:
<(?!\/?br(?=>|\s.*>))\/?.*?>
如果它只包含&#34;正常&#34;是否可以匹配整个文本?文字和BR标签?
例如,这些应匹配:
bob
bob<br>bob
bob<br />bob
bob</br>
这些不匹配
bob<p>bob
bob<div>bob
bob</div>bob
答案 0 :(得分:1)
可以使用两个否定lookaheads:
(?si)^(?!.*<(?!\/?br\b)\w).*
作为Java字符串:
"(?si)^(?!.*<(?!\\/?br\\b)\\w).*"
已使用s
(点匹配换行符),i
(无壳)modifier。
test at regexplanet(点击Java); test at regex101;见SO Regex FAQ
答案 1 :(得分:1)
(?=^[a-zA-Z0-9]+$|[^<>]*<\s*(\/)?\s*br\s*(\/)?\s*>[^<>]*)^.*$
你可以尝试这个。这使用积极的前瞻。参见演示。
答案 2 :(得分:1)
以下正则表达式可行,
String s = "bob\n" +
"bob<br>bob\n" +
"bob<br />bob\n" +
"bob</br>\n" +
"bob<p>bob\n" +
"bob<div>bob\n" +
"bob</div>bob";
Pattern regex = Pattern.compile("^\\w+(?:<(?=\\/?br(?=>|\\s.*>))\\/?.*?>(?:\\w+)?)?$", Pattern.MULTILINE);
Matcher matcher = regex.matcher(s);
while(matcher.find()){
System.out.println(matcher.group(0));
}
输出:
bob
bob<br>bob
bob<br />bob
bob</br