星期三, 6月 13, 2007

[Note]Regular expression 是貪婪的

前兩天才赫然發現,自己完全忽略了這個特性,導致結果完全不是我所預期...
這個特性就是貪婪(請參考:一輩子受用的 Regular Expressions -- 兼談另類的電腦學習態度)。

所以當你想要利用這個式子:\<title\>(?<titleStr>.*)\</title\> 去這堆文字: <title>AAA</title>...other tags...<title>BB</title> 取得每對 <title>...</title> 裡面的文字時,實際上只得到一個結果,內容是 AAA</title>...other tags...<title>BB

>_< 這下該怎麼辦?
我想到幾種方式:
  • 取得每個 <title> 的位置,然後再利用 String.IndexOf 去搜尋 </title>,取得位置之後,就可以取得<title>...</title> 裡面的文字。
  • 分別用 Regular Expression 取得<title>與</title>的位置,然後再依據結果,去取裡面的字串。


希望是能有更好的解~

2 則留言:

匿名 提到...

我用C#為例
string s = "<title>AA</title>blah<title>BB</title>";
foreach (Match m in Regex.Matches(s, "[<]title>(?<t>.+?)[<]/title>"))
Console.WriteLine(m.Groups["t"].Value);
關鍵在(?<t>.+?)裡最後的問號,可以叫Regular Expression不要那麼貪心。

elleryq 提到...

了解,謝謝你~
我會試試看。