如何制作一个指定任何顺序元素的正则表达式?

时间:2010-11-16 05:06:13

标签: regex

我想要一个匹配包含

的字符串的正则表达式
 - At least one brace: } or {  
and
 - At least one digit: \d  
and
 - At least one instance of either: <p> or </p>

但是以任何顺序,以便匹配所有以下内容:

<p>{123

2}</p>

2<p>}}}

{}{}{}<p></p></p>234234}}}

这些都不匹配:

<p>{ alphabet 123

{2}

{{{}}}

<p>1</p>

这是我到目前为止所提供的内容,它只需要其中任何一个组件:

(<\/p>|<p>|\d|\}|\{)+

我的问题是,我不知道如何更通用,而不必像这样指定顺序:

(<\/p>|<p>)+(\d)+(\}|\{)+

或者愚蠢地列举所有可能的顺序......

我怎么说“以任何顺序至少需要这些组件中的一个?”

感谢。

2 个答案:

答案 0 :(得分:5)

如果你的正则表达式支持前瞻,你可以使用正向前瞻:

^(?=.*(\{|\}))(?=.*\d)(?=.*(<p>|<\/p>)).*$

此正则表达式使用正向前瞻来断言该字符串为{}中的至少一个,至少一个数字且至少为<p></p>之一

如果你想确保字符串只有这些字符串,其他任何东西都不能使用正则表达式:

^(?=.*(\{|\}))(?=.*\d)(?=.*(<p>|<\/p>))(<\/p>|<p>|\d|\}|\{)*$

作为前一个正则表达式,但也确保输入没有其他字符。

Regex implemented in Perl

正则表达式可以缩短为:

^(?=.*[{}])(?=.*\d)(?=.*<\/?p>)(<\/?p>|[\d}{])*$

利用\{|\}[{}]相同,<p>|<\/p><\/?p>相同的事实。

答案 1 :(得分:0)

我想你只需检查三个表达式