假设我在javascript中有一个给定的字符串 - 例如var s = "
它可能很长(例如,25,000 +个字符)。var s = "
SomeText{{2}}SomeText";{{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”作为占位符来引用任意数量的纯文本字符。换句话说,“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” 则会
等...
这似乎是一个相对容易解决的问题 - 事实上我可以在没有正则表达式的情况下轻松解决它,但我很想学习如何用正则表达式做这样的事情。不幸的是,在这种情况下,我甚至不确定“条件和先行”是否是对问题的正确描述。
注意:如果提供的可行解决方案不涉及“条件和先行”,那么我将编辑标题。
答案 0 :(得分:4)
反转条件可能更容易。尝试匹配包含两个连续{{2}}
实例的任何文本,如果 与不匹配,那就很好。
使用此策略,您的模式可以像以下一样简单:
/{\{2}}([^{]*){\{2}}/
这将匹配文字{{2}}
,后跟除{
以外的零个或多个字符,后跟文字{{2}}
。
请注意,第二个{
需要转义,否则,正则表达式引擎会将{2}
视为上一个{
的量词(即{{2}
恰好匹配两个{
个字符。)
如果你需要允许{
之类的字符,以及两个{{2}}
之间的字符,你可以使用这样的模式:
/{\{2}}((?!{\{1}}).)*{\{2}}/
这将匹配文字{{2}}
,后跟零个或多个任何字符,只要这些字符创建类似
的序列,后跟文字{{1}}。 {{2}}
答案 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}]
替换所有点