如何编写正则表达式确保指定标签外无其他标签?
解决正则验证:仅允许
<ID>标签(含内部合法标签),外部无其他标签 需求说明
需要编写正则表达式,确保文本中除了<ID>标签(其内部可包含<F>标签)之外,不存在任何其他标签。
不通过案例
This <F>is</F> a test <ID><F>sentence</F></ID> for stackoverflow.(ID标签外存在<F>标签)This <ID><M>is</M></ID> a test <F>sentence</F> for stackoverflow.(ID标签内存在未允许的<M>标签)
通过案例
This is a test <ID><F>sentence</F></ID> for stackoverflow.(ID标签外无多余标签,内部<F>合法)This is a test <ID><F>sentence</F></ID> for <ID>stackoverflow.</ID>(多个ID标签,外部无其他标签)
原尝试的问题
你之前的尝试中,第3步添加的负向先行断言(?!.+?[<>])会导致正则为了满足“后面没有<>”的条件,错误地扩展匹配范围到最后一个ID标签,这是因为.+?的惰性匹配会被断言强制“吃掉”中间的内容。
正确的正则表达式方案
要实现需求,需要从全局验证的角度出发,而不是只匹配单个ID标签。正确的正则应该确保:
- 所有标签要么是
<ID>/</ID>,要么是ID内部的<F>/</F>; - 不存在任何其他形式的标签。
可以使用以下正则(根据使用场景开启多行模式m和全局模式g):
^(?:(?!<\/?(?!ID|F)\w+>).)*$
正则解释:
^和$:匹配文本的开头和结尾,确保全局验证;(?:...):非捕获组,用于循环匹配;(?!<\/?(?!ID|F)\w+>):负向先行断言,确保当前位置后不存在不是ID/F的标签(比如<M>、</M>、ID外的<F>等);.*:匹配任意字符(除换行符,若需支持换行可改用[\s\S]*)。
如果需要同时确保ID标签是正确嵌套的(比如不出现<ID>未闭合的情况),可以进一步优化为:
^(?:(?!<\/?(?!ID|F)\w+>)[^<>]|<ID>(?:(?!<\/?(?!ID|F)\w+>)[^<>]|<F>[^<>]*<\/F>)*<\/ID>)*$
这个正则会严格验证:所有标签要么是正确嵌套的<ID>(内部可包含<F>),要么没有其他标签,同时ID标签内部也不允许出现除<F>外的其他标签。
内容的提问来源于stack exchange,提问作者Laurent Dhont
相关产品推荐
相关产品推荐

