正则表达式匹配除了<br/>之外没有标签

时间:2014-09-10 10:45:15

标签: regex

我们需要匹配用户输入中的文字,但明确拒绝任何不是<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

3 个答案:

答案 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*>[^<>]*)^.*$

你可以尝试这个。这使用积极的前瞻。参见演示。

http://regex101.com/r/kO7lO2/4

答案 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