Jquery 重复正则群
我有一个这样的模式,它匹配多组值:Jquery 重复正则群,jquery,regex,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> <spa
(((\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 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>"
不起作用,因为我需要创建数量可变的跨度元素
这里有我遗漏的东西吗
谢谢 我想在这种情况下,您只需要按空格进行分割:
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);
}
我想在这种情况下,你只需要用空格分开:
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);
}
你的问题没有给出答案吗?我只是在用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标签,以为这是一个regexp问题
不要试图一次将它们全部匹配;让/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>
你的问题没有给出答案吗?我只是在用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标签,以为这是一个regexp问题
不要试图一次将它们全部匹配;让/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>
以下内容在VIM中起作用
:%s/\(\w\+\) \(\d\+\)/<span class="\1">\2<\/span>\r/ig
类似的功能应该可以在jquery中使用。以下功能可以在VIM中使用
:%s/\(\w\+\) \(\d\+\)/<span class="\1">\2<\/span>\r/ig
类似的方法在jquery中也应该适用。为什么不将它们放在一个数组中呢?如果您实际上是在用数字创建一组跨度,那么这样做更有意义:
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);
});
为什么不把它们放在一个数组中呢?如果你实际上是在用数字创建一组跨距,这就更有意义了:
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);
});
不要尝试重复匹配,只需使用\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 );
不要尝试重复匹配,只需使用\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 );
您缺少的是您的正则表达式与整个字符串相匹配,而您希望逐段替换它: /\w+\d+/匹配五个5或一个1,但不是一个1和2 /?:\w++\d++/匹配一个1或一个1两个2或一个1两个2三个3,以此类推 +与前面的模式匹配1次或多次 旁注:?:。。。就像。。。除此之外,它没有将任何内容捕获到$1、$2等中,它只是将内容分组 因此,对于您的问题,您只需要删除+:
每当模式匹配时,/g全局标志将负责重复替换。您缺少的是正则表达式与整个字符串匹配,而您希望逐段替换它: /\w+\d+/匹配五个5或一个1,但不是一个1和2 /?:\w++\d++/匹配一个1或一个1两个2或一个1两个2三个3,以此类推 +与前面的模式匹配1次或多次 旁注:?:。。。就像。。。除此之外,它没有将任何内容捕获到$1、$2等中,它只是将内容分组 因此,对于您的问题,您只需要删除+:
/g全局标志将负责在每次模式匹配时重复您的替换。是因为我,还是因为我才这样做?是因为我,还是因为我才这样做?您好,您能解释一下这里发生了什么吗?因为我一点也不懂,所以不能适应。谢谢我在支持正则表达式的VI编辑器中尝试了这个方法,它很有效。我不知道jquery是什么,但我希望它能在那里工作。它基本上是/\w+\d+/\2/ig,为vi editorHi提供了适当的转义,你能解释一下这里发生了什么吗?因为我一点也不懂,所以不能适应。谢谢我在支持正则表达式的VI编辑器中尝试了这个方法,它很有效。我不知道jquery是什么,但我希望它能在那里工作。它基本上是/\w+\d+/\2/ig,为vi编辑器提供了适当的转义。我不是,这只是一个示例,需要学习如何将元素数与regex中的重复数同步。对不起,我不是,这只是一个示例,需要学习如何将元素数与regex中的重复数同步。你可能是对的,我很愚蠢吗?0.o将进行更多测试并回复您,谢谢!它是有效的,但只有b/c正则表达式不能解释对之间的空间。你可能是对的,我是不是很蠢?0.o将进行更多测试并回复您,谢谢!它可以工作,但只有b/c正则表达式不考虑对之间的空间。正确:正则表达式一次只需匹配一对令牌;是正则表达式引擎对匹配项进行迭代;这是注册号
对匹配项进行迭代的ex引擎。这很好。多亏了你,我才能够构建:ThisGuyRocksHard.replace/^[A-Z]?.*?[A-Z]/g,'1$2_$3',这正是我所需要的。不过,我还是很困惑。如果我想将字符串中的所有大写字母收集到全局变量中,该怎么办?我尝试了/^[A-Z]?:.*[A-Z]+//在最外层的捕获组的内部和外部使用+键。。。但是没有用。重复比赛分组很难!你想要所有的大写字母吗?ThisgyRockShard。替换/[^A-Z]/g;//TGRH或thisgyrockshard.match/[A-Z]/g/['T','g','R','H']哈哈,是的。有趣的是,除了第一个,我真的想要所有的。我最终使用了我第一次想到的方法,然后换掉了“T”。这很好。多亏了你,我才能够构建:ThisGuyRocksHard.replace/^[A-Z]?.*?[A-Z]/g,'1$2_$3',这正是我所需要的。不过,我还是很困惑。如果我想将字符串中的所有大写字母收集到全局变量中,该怎么办?我尝试了/^[A-Z]?:.*[A-Z]+//在最外层的捕获组的内部和外部使用+键。。。但是没有用。重复比赛分组很难!你想要所有的大写字母吗?ThisgyRockShard。替换/[^A-Z]/g;//TGRH或thisgyrockshard.match/[A-Z]/g/['T','g','R','H']哈哈,是的。有趣的是,除了第一个,我真的想要所有的。我最终使用了我第一次想到的方法,然后换掉了“T”。