1

正規表現の助けが必要です。一致させたいこのコードがあります。

var i1 = "<ul> {{#items}}<li>{{.}}</li>{{/items}} </ul>";
var i2 = "<ul> {{#items}}<li>{{.}}</li> <li><ul> {{#items}}<li>{{.}}</li>{{/items}} </ul></li>{{/items}} </ul>";
var i3 = "<ul> {{#items}}<li>{{.}}</li>{{/items}} </ul> <ul> {{#items}}<li>{{.}}</li>{{/items}} </ul>";


var reg = /{{(?:(?:#|!#)([\s\w\.-]+))}}+(.+(?:{{\/.+}}))/

i1 => ["{{#items}}<li>{{.}}</li>{{/items}}", "items", "<li>{{.}}</li>"]
i2 => ["{{#items}}<li>{{.}}</li> <li><ul> {{#items}}<li>{{.}}</li>{{/items}} </ul></li>{{/items}}", "items", "<li>{{.}}</li> <li><ul> {{#items}}<li>{{.}}</li>{{/items}} </ul></li>"]
i3 => ["{{#items}}<li>{{.}}</li>{{/items}} </ul> <ul> {{#items}}<li>{{.}}</li>{{/items}}", "items", "<li>{{.}}</li>{{/items}} </ul> <ul> {{#items}}<li>{{.}}</li>"]

最後のものは私が望むものと一致しません。最初の ul#items に一致し、最初の {{/items}} が来ると停止するようにしたいだけです。reg は、最初の 2 つの HTML タグなしで機能します。

最後の方法を理解するのに助けが必要です。

ありがとう

4

1 に答える 1

2

あなたのパターンは貪欲です。つまり、可能な限り最大の文字列に一致します。.*?.+?の代わりに.*とを使用し.+ます。「貪欲」演算子と「怠惰」演算子の違いの詳細な説明については、こちらを確認してください。

于 2011-05-01T18:00:57.490 に答える