簡體   English   中英

JS / Regex匹配方式不應該

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM