[英]JS/Regex matching way more than it should
我有一段正則表達式從文本中解析出一個表單,其中(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]]
...
試試這個:
/\\[\\[(?:[ox]:|_:v=)[^\\]]+\\]\\]/gi
結果:
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 ']]'
您似乎想要這樣:
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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.