2009-06-19 47 views
1

我有這樣的匹配多組值的模式:重複的正則表達式組

(((\w+) (\d+))+) 

我認爲這將匹配:

one 1 two 2 three 3 four 4 five 5 

但因爲我不知道有多少重複出現我不知道該輸出什麼。

比如我需要得到的結果弄成這個樣子:

<span class="one">1</span> 
<span class="two">2</span> 
<span class="three">3</span> 
<span class="four">4</span> 
<span class="five">5</span> 

因此,像這樣:

/(((\w+) (\d+))+)/ig, "<span class=\"$3\">$4</span>" 

是行不通的,因爲我需要創建一個變量數跨度元素。

有什麼我在這裏失蹤?

謝謝!

+0

難道只是我,還是那到底該怎麼做打算? – Stobor 2009-06-19 04:47:25

回答

3

什麼你缺少的是你的正則表達式匹配整個字符串,當你想通過片來代替它片:

  • /(\w+) (\d+)/匹配"five 5""one 1"或,而不是"one 1two 2"
  • /(?:(\w+) (\d+))+/比賽"one 1""one 1two 2""one 1two 2three 3"

+的前述圖案1次或多次匹配。

(旁註:(?:...)就像(...)只是它不捕獲任何進入$1$2,等等,它只是團體的事情。)

因此,對於你的問題,你只需要刪除+

/(\w+) (\d+)/ig, "<span class=\"$1\">$2</span>" 

/g(全局)標誌將負責在每次模式匹配時重複您的替換。

2

我認爲你只是要去想用空格在這種情況下,分割:

s = "one 1 two 2 three 3 four 4 five 5"; 

// Replace runs of whitespace with a single space, and trim... 
s.replace(/\s+/g, ' '); 
s.replace(/^\s+|\s+$/g, '') 

// And split string into an array 
var parts = "one 1 two 2 three 3 four 4 five 5".split(' ') 

for (var i=0; i<parts.length; i++){ 

    // Get your pieces 
    var name = parts.shift(); 
    var num = parseInt(parts.shift()); 

    // Create your span 
    var span = $('<span></span>').attr('class', name).text(num); 

} 
0

不你的問題給你的答案?我只是用javascript控制檯進行測試:

>>> "one 1 two 2 three 3 four 4 five 5".replace(/(((\w+) (\d+))+)/ig, "<span class=\"$3\">$4</span>") 
<span class="one">1</span> <span class="two">2</span> <span class="three">3</span> <span class="four">4</span> <span class="five">5</span> 

>>> "one 1 two 2 three 3 four 4".replace(/(((\w+) (\d+))+)/ig, "<span class=\"$3\">$4</span>") 
<span class="one">1</span> <span class="two">2</span> <span class="three">3</span> <span class="four">4</span> 

>>> "one 1 two 2 three 3".replace(/(((\w+) (\d+))+)/ig, "<span class=\"$3\">$4</span>") 
<span class="one">1</span> <span class="two">2</span> <span class="three">3</span> 

>>> "one 1 two 2 three 3 foo five 5".replace(/(((\w+) (\d+))+)/ig, "<span class=\"$3\">$4</span>") 
<span class="one">1</span> <span class="two">2</span> <span class="three">3</span> foo <span class="five">5</span> 

它看起來確實如你所願。

編輯:下面的原始答案;我錯過了jquery標籤,認爲這是一個正則表達式問題...

不要試圖一次性匹配它們;讓/ G搞定......

bash$ echo "one 1 two 2 three 3 four 4 five 5" | \ 
     sed -e 's/\([[:alpha:]]\+\)\s*\([[:digit:]]\+\)\s*/<span class="\1">\2<\/span>\n/g' 

這給

<span class="one">1</span> 
<span class="two">2</span> 
<span class="three">3</span> 
<span class="four">4</span> 
<span class="five">5</span> 
+0

D'Oh!錯過了jQuery的標籤... – Stobor 2009-06-19 04:45:08

+0

你可能是對的,我是愚蠢的? 0.o會測試更多並回復你,謝謝! – Jourkey 2009-06-19 05:05:16

+0

它的工作原理,但只有B/C的正則表達式不考慮對之間的空間。 – rampion 2009-06-19 11:02:01

0

在VIM以下的作品。

:%s/\(\w\+\) \(\d\+\)/<span class="\1">\2<\/span>\r/ig 

類似的應該在jQuery中工作。

+0

嗨,你能解釋一下這裏發生了什麼?因爲我根本不理解它,所以不能適應。 謝謝! – Jourkey 2009-06-19 04:59:01

+0

我在支持正則表達式的VI編輯器中試過這個工具。我不知道jquery是什麼,但我期望它能在那裏工作。它基本上是/(\ W +)(\ d +)/ <跨度類= 「\ 1」> \ 2/IG與適當轉義vi編輯 – Canopus 2009-06-19 05:06:04

0

爲什麼你會不會有那些在一個陣列,這更有意義(如果你實際上做與數字一堆跨度):

var arr = ['one','two','three','four','five','six','seven','eight','nine','ten']; 

$.each(arr, function(i, val) { 
    var $span = $('<span></span>').attr('class', val).text(i+1); 
    $('#someDiv').append($span); 
}); 
2

而不是試圖重複你的比賽,只是使用(\w+) (\d+)並重復替換多次(這是g全局替換標誌的作用)。

注意:您擁有的i標誌是多餘的,因爲\ w包含兩種情況,\ d僅爲數字。

假設頁面設置適當和$ j的所有其他部分是jQuery對象,根據需要這將工作:

var MyText = $j(something).text(); 

HtmlContent = MyText.replace(/(\w+) (\d+)/g , '<span class="$1">$2</span>'); 

$j(something).html(HtmlContent);