2014-09-10 147 views
0

我们需要匹配来自用户输入的文本,但明确拒绝任何不是<br>的标签。正则表达式匹配没有标签,除了<br>

从其他stackoverflow帖子我可以找到相反的匹配,我需要什么(即它匹配的违规标签,而不是文本和其他标签)。由于受到限制,我们不能使用负逻辑来验证。正则表达式是:

<(?!\/?br(?=>|\s.*>))\/?.*?> 

如果只包含“普通”文本和BR标签,是否可以匹配整个文本?

例如,这些应该符合:

bob 
bob<br>bob 
bob<br />bob 
bob</br> 

这些应该不匹配

bob<p>bob 
bob<div>bob 
bob</div>bob 
+0

感谢阿维纳什! – 2014-09-10 10:46:51

+1

你的意思是这个http://regex101.com/r/dK5dX1/1?这个'<(?=\/?br(?=> | \ s。*>))\ /?。*?>'会和你提到的正则表达式相反。 – 2014-09-10 10:51:06

+0

它出现某种原因似乎不能在Java中工作(对不起,应该说) - 在这里检查: - http://www.regexplanet.com/advanced/java/index.html – 2014-09-10 11:07:12

回答

1

可以使用两个负lookaheads

(?si)^(?!.*<(?!\/?br\b)\w).* 

为Java String:

"(?si)^(?!.*<(?!\\/?br\\b)\\w).*" 

使用s(点匹配换行符),i(无案件)modifier

test at regexplanet(点击Java); test at regex101;见SO Regex FAQ

+0

谢谢!工作很棒! – 2014-09-10 11:29:40

+0

@AshMcConnell很高兴,本来可以帮忙:) – 2014-09-10 11:30:49

1
(?=^[a-zA-Z0-9]+$|[^<>]*<\s*(\/)?\s*br\s*(\/)?\s*>[^<>]*)^.*$ 

你可以试试这个。这个使用postive lookahead.See demo。

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

+0

感谢您的帮助vks! – 2014-09-10 11:31:10

+0

@AshMcConnell我们欢迎:) – vks 2014-09-10 11:32:41

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 
+0

感谢您的帮助Avinash! – 2014-09-10 11:30:19