2010-01-21 13 views
5

我有一個像下面的簡化示例的正則表達式:使用JavaScript的正則表達式查找第一個和最長的比賽

var exp = /he|hell/; 

當我在一根繩子上運行它,它給我的第一場比賽,FX:

var str = "hello world"; 
var match = exp.exec(str); 
// match contains ["he"]; 

我想要第一個和最長的匹配, ,並且我的意思是按索引,然後長度排序。

由於該表達式是由RegExp的數組組合而成的,因此我正在尋找一種方法來查找最長匹配而不必重寫正則表達式。

這可能嗎?

如果不是,我正在尋找一種方法來輕鬆分析表達式,並按正確的順序排列。但我無法弄清楚如何,因爲表情可能是一個複雜得多,FX:

var exp = /h..|hel*/ 
+0

你的第二個例子會更有趣,如果它是例如:'/ h .... | hel * /' – 2010-01-21 14:00:50

+0

它對我來說看起來是一樣的。我其實想說明最長的正則表達式不一定是最長的匹配。我的簡單表達式應該是'/ h。*?| hello /'。但我猜這個網站的用戶無論如何都知道我的意思。至少你做了:-) – 2010-01-21 14:06:56

+0

如果可以在javascript中使用可變寬度lookbehind斷言(因爲它們例如在.NET和JGsoft正則表達式中),您可以通過以下方式實現它:'exp = /.*(?<=h .. | hel *)/'。但是到目前爲止,這個功能在JS中是不可預料的。 – 2010-01-21 15:43:17

回答

2

我知道的所有正則表達式實現將嘗試從左到右匹配字符/模式,並在每次找到全部匹配時終止。換句話說:如果你想確保你獲得最長的匹配,你需要嘗試所有模式(單獨),存儲所有匹配,然後從所有可能的匹配中獲得最長的匹配。

+1

我知道。我編輯了這個問題。感謝你的回答。我將首先找到第一個匹配的索引,然後將^加到每個RegExp中,並從第一個索引開始搜索子串,因爲查找不在那裏的表達式,請求遍歷所有文本。 – 2010-01-21 14:16:19

3

如何/hell|he/

+3

並不總是像這個例子那樣明顯。 – Jirka 2011-06-13 13:28:32

+0

簡單但具有破壞性。 :) – zx81 2014-06-11 06:25:12

1

您不能用正則表達式做「」「最長匹配」(或涉及計數,減去預見的任何事情)。

最好的辦法是找到全部匹配項,並簡單比較程序中的長度。

+0

通過查找所有匹配你的意思分開在|的正則表達式並分別尋找每個部分? (因此,我們不需要查找(a |(b(c | d)),我們需要查找3個表達式:a,bc,bd。不知道是否還需要考慮可選性 或者是否有一些支持查找所有匹配? – Jirka 2011-06-13 13:26:59

+0

@ Jirka-x1:有支持找到* next *匹配;我只是想寫一個遍歷每一個匹配的循環,並保持哪個最長的跟蹤 – 2011-06-13 15:11:42

+0

我不確定關於JavaScript,但在Java中,你的方法不起作用。 'Matcher m = Pattern.compile(「hell」).matcher(「hello world」); while(m.find()){ System.out.println(m.group()); }' 產生一個結果:'he'。第二個和隨後的invoca find()的第一個字符開始於前一個調用不匹配的第一個字符。 – Jirka 2011-07-03 10:07:38

0

我不知道這是不是你要找的內容(考慮到這個問題,幾乎是8歲......),但這裏是我的鹽糧:

(基於最大第一切換爲他將地獄執行搜索)

var exp = /hell|he/; 
var str = "hello world"; 
var match = exp.exec(str); 

if(match) 
{ 
    match.sort(function(a, b){return b.length - a.length;});    
    console.log(match[0]); 
} 

在哪裏比賽[ 0]將會是所有字符串中最長的匹配。

相關問題