JS / Regex匹配方式比应做的更多

时间:2018-08-17 10:09:56

标签: javascript regex

我有一段正则表达式从文本中解析出一个表单,正则表达式变为/\[\[(?:.*(?:(?:(?:_:v=(.*))|o|x):s=(\d))|(h=(\d)))?\]\]/g,并且应该匹配(以后在每次匹配时都使用/ g进行分组)信息的格式为[[((o|x|_v:=*answer*):s=*points*)|(h=*points*)]]

该信息的真实示例:

"https://asiointi.maanmittauslaitos.fi/karttapaikka/Etsi Karttapaikka-
palvelusta Forssan maastokartta ja tee tehtävät (voi tehdä pareittain). 
Klikkaa + ja - näppäimiä, kun etsit paikkojen nimiä ja karttamerkkejä.1. 
Etsi Pyhäjärven Similänlahti.a) Millaista metsää sen rannalla on? 
[[_:v=lehtimetsä:s=1:t=]]b) Mitä on kohdassa, jossa lukee Urpola? 
[[_:v=pelto:s=1:t=]]2. Kuinka korkea on Korkeavahan korkein kohta? 
[[_:v=135:s=1:t=]] metriä.3. Kuinka pitkä matka on Kuhalan koululta 
linnuntietä (lähtö yläkoulun pihalta, klikkaa viivoitin-kuvaketta, alku- 
ja loppupiste kaksoisklikkaus, tyhjennä kartta mittausten välillä)a) 
Keskurille?[[o:s=0]] 500 m[[o:s=0]] 600 m[[o:s=0]] 700 m[[o:s=0]] 800 
m[[o:s=1]] 900 mb) Tölölle?[[o:s=0]] 500 m[[o:s=0]] 600 m[[o:s=1]] 700 
m[[o:s=0]] 800 m[[o:s=0]] 900 m4. Lisää kartalle oma merkintä. Merkitse 
kotitalosi otsikolla esim. Kullervon koti."

它匹配从第一个[[到最后一个]]的所有内容,即使它应该是惰性的。为什么是这样?

编辑:我想要的

我希望它能给我完整的比赛清单,例如

[[_:v=lehtimetsä:s=1:t=]]
[[_:v=pelto:s=1:t=]]
[[_v:=135:s=1:t=]]
[[o:s=0]]
...

2 个答案:

答案 0 :(得分:0)

尝试一下:

/\[\[(?:[ox]:|_:v=)[^\]]+\]\]/gi

Demo

结果:

Match 1
Full match  285-310 `[[_:v=lehtimetsä:s=1:t=]]`
Match 2
Full match  352-372 `[[_:v=pelto:s=1:t=]]`
Match 3
Full match  420-438 `[[_:v=135:s=1:t=]]`
Match 4
Full match  644-653 `[[o:s=0]]`
Match 5
Full match  659-668 `[[o:s=0]]`
Match 6
Full match  674-683 `[[o:s=0]]`
Match 7
Full match  689-698 `[[o:s=0]]`
Match 8
Full match  705-714 `[[o:s=1]]`
Match 9
Full match  731-740 `[[o:s=0]]`
Match 10
Full match  746-755 `[[o:s=0]]`
Match 11
Full match  761-770 `[[o:s=1]]`
Match 12
Full match  777-786 `[[o:s=0]]`
Match 13
Full match  792-801 `[[o:s=0]]`

说明:

\[\[        # Literal '[[' (must be scaped since [] are used for character classes)
(?:         # 2 options (separated by |)
    [ox]:   # Option1: Either 'o' or 'x' character followed by ':'
   |_:v=    # Option2: Literal '_:v='
)
[^\]]+      # Any non-']' character repeated 1 or more times
\]\]        # Literal ']]'

答案 1 :(得分:0)

您似乎想要这个:

var s = document.querySelector("pre").innerHTML.replace(/\n/g, "");
var matches = s.match(/\[\[((_:v=[^:\]]+)|o|x):s=(\d)(:t=\d?)?\]\]/g);
console.log(matches);
<pre>
https://asiointi.maanmittauslaitos.fi/karttapaikka/Etsi Karttapaikka-
palvelusta Forssan maastokartta ja tee tehtävät (voi tehdä pareittain). 
Klikkaa + ja - näppäimiä, kun etsit paikkojen nimiä ja karttamerkkejä.1. 
Etsi Pyhäjärven Similänlahti.a) Millaista metsää sen rannalla on? 
[[_:v=lehtimetsä:s=1:t=]]b) Mitä on kohdassa, jossa lukee Urpola? 
[[_:v=pelto:s=1:t=]]2. Kuinka korkea on Korkeavahan korkein kohta? 
[[_:v=135:s=1:t=]] metriä.3. Kuinka pitkä matka on Kuhalan koululta 
linnuntietä (lähtö yläkoulun pihalta, klikkaa viivoitin-kuvaketta, alku- 
ja loppupiste kaksoisklikkaus, tyhjennä kartta mittausten välillä)a) 
Keskurille?[[o:s=0]] 500 m[[o:s=0]] 600 m[[o:s=0]] 700 m[[o:s=0]] 800 
m[[o:s=1]] 900 mb) Tölölle?[[o:s=0]] 500 m[[o:s=0]] 600 m[[o:s=1]] 700 
m[[o:s=0]] 800 m[[o:s=0]] 900 m4. Lisää kartalle oma merkintä. Merkitse 
kotitalosi otsikolla esim. Kullervon koti.
</pre>