重复的正则表达式组

时间:2009-06-19 04:23:46

标签: jquery regex

我有一个这样的模式,它匹配多组值:

(((\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>"

不起作用,因为我需要创建一个可变数量的span元素。

这里有什么我想念的吗?

谢谢!

6 个答案:

答案 0 :(得分: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(全局)标志都会重复替换。

答案 1 :(得分: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);

}

答案 2 :(得分: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 );

答案 3 :(得分: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>

答案 4 :(得分:0)

以下在VIM中有效。

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

类似的应该在jquery中工作。

答案 5 :(得分: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);
});