我有一个这样的模式,它匹配多组值:
(((\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元素。
这里有什么我想念的吗?
谢谢!
答案 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);
});