Javascript正则表达式(模式的不间断重复)

时间:2014-01-07 19:58:07

标签: javascript regex

假设我在javascript中有一个给定的字符串 - 例如var s = "var s = "{{2}}Hi there. This is a string with one { curly bracket{{2}}Oh, very nice to meet you. I also have one } curly bracket!";SomeText{{2}}SomeText";它可能很长(例如,25,000 +个字符)。

注意:我在这里使用“SomeText”作为占位符来引用任意数量的纯文本字符。换句话说,“SomeText”可以是任何不包含{{2}}或{{2}}的纯文本字符串。所以上面的例子可能是{{1}}而这完全有效。

规则很简单:

它不需要{{1}}的任何实例。但是,如果确实如此,那么在该实例之后我们不会遇到另一个{{1}},除非我们首先找到{{1}}。

有效示例:

“{{2}} SomeText” 则会

“{{1}} SomeText {{2}} SomeText” 则会

“{{1}} {SomeText {1}} SomeText {{2}} SomeText” 则会

“{{1}} {SomeText {1}} SomeText {{2}} {SomeText {1}} SomeText” 则会

“{{1}} {SomeText {1}} SomeText {{2}} {SomeText {1}} {SomeText {1}} SomeText” 则会

“{{1}} {SomeText {1}} SomeText {{2}} {SomeText {1}} {SomeText {1}} SomeText {{2}} SomeText” 则会

等...

无效的例子:

“{{2}} SomeText {{2}} SomeText” 则会

“{{1}} SomeText {{2}} SomeText {{2}} SomeText” 则会

“{{1}} SomeText {{2}} SomeText {{2}} {SomeText {1}} SomeText” 则会

等...

这似乎是一个相对容易解决的问题 - 事实上我可以在没有正则表达式的情况下轻松解决它,但我很想学习如何用正则表达式做这样的事情。不幸的是,在这种情况下,我甚至不确定“条件和先行”是否是对问题的正确描述。

注意:如果提供的可行解决方案不涉及“条件和先行”,那么我将编辑标题。

3 个答案:

答案 0 :(得分:4)

反转条件可能更容易。尝试匹配包含两个连续{{2}}实例的任何文本,如果 不匹配,那就很好。

使用此策略,您的模式可以像以下一样简单:

/{\{2}}([^{]*){\{2}}/

Demonstration

这将匹配文字{{2}},后跟除{以外的零个或多个字符,后跟文字{{2}}

请注意,第二个{需要转义,否则,正则表达式引擎会将{2}视为上一个{的量词(即{{2}恰好匹配两个{个字符。)


如果你需要允许{之类的字符,以及两个{{2}}之间的字符,你可以使用这样的模式:

/{\{2}}((?!{\{1}}).)*{\{2}}/

Demonstration

这将匹配文字{{2}},后跟零个或多个任何字符,只要这些字符创建类似{{2}}的序列,后跟文字{{1}}。

答案 1 :(得分:0)

(({{1}}SomeText)+({{2}}SomeText)?)*

细分:

({{1}} SomeText)+ - 1到多个{{1}}个实例(贪婪匹配)

({{2}} SomeText)? - 后跟可选的{{2}}实例

然后整个事情被包裹在()*中,这样序列可以连续出现0到多次。

无需条件或前瞻。

答案 2 :(得分:0)

你说你可以先有一个{2}的实例,对吗?

^(.(?!{2}))(.{2})?(?!{2})((.(?!{2})){1}(.(?!{2}))({2})?)$

注意{2}是一个字母,用[^ {2}]

替换所有点