[英]What am I doing wrong with my regex?
我正在嘗試從以下位置捕獲“ Rio Grande Do Leste”:
...
<h1>Rio Grande Do Leste<br />
...
使用
var myregexp = /<h1>()<br/;
var nomeAldeiaDoAtaque = myregexp.exec(document);
我究竟做錯了什么?
更新:
剩下兩個問題:
1)搜索(document)沒有產生任何結果,但是將其更改為(document.body.innerHTML)即可。 這是為什么?
2)我必須將其更改為:myregexp.exec(document.body.innerHTML) [1] ; 得到我想要的,否則它將給我一些結果,其中包括<h1>
。 這是為什么?
3)(回答)為什么我需要使用“。*”? 我相信它會在()之間收集任何東西嗎?
嘗試/<h1>(.*?)<br/
。
捕獲組嘗試捕獲其匹配的對象 。 這有一些重要的后果:
這是一個簡單的模式,其中包含2個捕獲組:
(\d+) (cats|dogs)
\___/ \_________/
1 2
假設i have 16 cats, 20 dogs, and 13 turtles
,那么將有2場比賽( 如在rubular.com上看到的那樣 ):
16 cats
是比賽:第1組捕捉16
cats
,第2組捕捉cats
20 dogs
:第1組捕捉20
dogs
,第2組捕捉dogs
現在考慮對模式進行以下修改:
(\d)+ (cats|dogs)
\__/ \_________/
1 2
現在,組1匹配\\d
,即一位數字。 在大多數情況下,重復匹配的組(在本例中為+
)只能保留最后一個匹配項。 因此,在大多數口味中,第1組僅捕獲匹配的最后一個數字( 如在rubular.com上所示 ):
16 cats
:第1組捕捉6
cats
,第2組捕捉cats
20 dogs
是匹配項:第1組捕捉0
,第2組捕捉dogs
現在讓我們考慮匹配“ A
和ZZ
之間A
所有內容”的問題。 事實證明,該規范是模棱兩可的:我們將提出3種模式來完成此任務,並且它們將產生不同的匹配項。 哪一個是“正確的”取決於期望,而該期望在原始語句中未正確傳達。
我們使用以下內容作為輸入:
eeAiiZooAuuZZeeeZZfff
我們使用3種不同的模式:
A(.*)ZZ
產生1個匹配項: AiiZooAuuZZeeeZZ
( 如ideone.com所示 )
iiZooAuuZZeee
A(.*?)ZZ
產生1個匹配項: AiiZooAuuZZ
( 如ideone.com所示 )
iiZooAuu
A([^Z]*)ZZ
產生1個匹配項: AuuZZ
( 如ideone.com所示 )
uu
這是它們匹配內容的直觀表示:
___n
/ \ n = negated character class
eeAiiZooAuuZZeeeZZfff r = reluctant
\_________/r / g = greedy
\____________/g
有關這三種技術之間差異的更深入的處理,請參閱相關問題。
.*?
之間的區別.*?
和.*
用於正則表達式
因此,讓我們回到問題,看看模式出了什么問題:
<h1>()<br
\/
1
組1匹配空字符串,因此整個模式總體上只能匹配<hr1><br
,而組1只能匹配空字符串。
可以嘗試以多種不同方式“修復”此問題。 可以嘗試的3個明顯的方法是:
<h1>(.*)<br
; 貪婪 <h1>(.*?)<br
; 不情願 <h1>([^<]*)<br
; 否定角色類 您會發現上述所有“工作”都無濟於事; 某些HTML會出現問題。 這是可以預期的:正則表達式是這項工作的“錯誤”工具。 您可以嘗試使模式變得越來越復雜,使其更“正確”,而較少“錯誤”。 您很有可能最終會陷入一個沒人能理解和/或維護的可怕混亂,而且它仍然有可能在100%的時間內“正確”地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.