簡體   English   中英

我的正則表達式有什么問題?

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

在捕獲組上

捕獲組嘗試捕獲其匹配的對象 這有一些重要的后果:

  • 一無所有的小組永遠無法捕獲任何東西。
  • 僅匹配空字符串的組只能捕獲空字符串。
  • 在比賽嘗試中反復捕獲的組只能保留最后一次捕獲
    • 通常對於大多數口味都是正確的,但是.NET正則表達式是一個例外(請參閱相關問題)

這是一個簡單的模式,其中包含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

參考文獻


關於貪婪vs.勉強vs.消極角色

現在讓我們考慮匹配“ AZZ之間A所有內容”的問題。 事實證明,該規范是模棱兩可的:我們將提出3種模式來完成此任務,並且它們將產生不同的匹配項。 哪一個是“正確的”取決於期望,而該期望在原始語句中未正確傳達。

我們使用以下內容作為輸入:

eeAiiZooAuuZZeeeZZfff

我們使用3種不同的模式:

  • A(.*)ZZ產生1個匹配項: AiiZooAuuZZeeeZZ如ideone.com所示
    • 這是貪婪的變體。 第1組匹配並捕獲的iiZooAuuZZeee
  • A(.*?)ZZ產生1個匹配項: AiiZooAuuZZ如ideone.com所示
    • 這是勉強的變體。 第1組匹配並捕獲的iiZooAuu
  • A([^Z]*)ZZ產生1個匹配項: AuuZZ如ideone.com所示
    • 這是否定的字符類變體。 組1匹配並捕獲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%的時間內“正確”地工作。

要么

^(<h1>)(.)+(<br />)

去這里測試gskinner.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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