javascript - 如何在 javascript 的替换中循环遍历正则表达式的匹配项?

标签 javascript jquery regex lambda match

我有以下 JavaScript(<P> 中的空格是不间断的):

var html = '...<li>sub 2</li></ol></li></ol>\n\
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subsub 1</p>\n\
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subsub 2</p>\n\
<ol start="2"> \n\
<ol start="3"> \n\
<li>sub 3</li></ol>...';

$(function () {
    var nestedListFixer = /(?:<\/li><\/ol>\s*)+(?:<p>(?:&(?:nbsp|\#0*160|x0*A0);)+(?:\s[ivxlcdm]+\.)(?:&(?:nbsp|\#0*160|x0*A0);)+\s(.*?)<\/p>\s*)+(?:<ol(?:\sstyle=\"[^\"]+\")?\sstart=\"[^\"]+\">\s*)+/i;
    html = html.replace(nestedListFixer, function($0, $1){
        var lis = ""
        $.each($1, function () {
            lis += "<li>" + this + "</li>\n";
        });
        alert("<ol>\n" + lis + "</ol></li>");
        return "<ol>\n" + lis + "</ol></li>";
    });
});

alert() 的输出:

<ol>
<li>s</li>
<li>u</li>
<li>b</li>
<li>s</li>
<li>u</li>
<li>b</li>
<li> </li>
<li>2</li>
</ol></li>

这是我希望的:

<ol>
<li>subsub 1</li>
<li>subsub 2</li>
</ol></li>

如何正确循环遍历 $1 中的每个匹配项?

更新:简化模式和匹配示例:

var text = '1ab2cb3cd4ab5cb6cd7';

$(function () {
    var textFixer = /(?:a)(?:b(.*?)c)+(?:d)/i;
    text = text.replace(textFixer, function($0, $1){
        var numbers = "";
        $.each($1, function () {
            numbers += this;
        });
        alert(numbers);
        return numbers;
    });
    alert(text);
});

// actual text:
// 13467
// desired text:
// 1234567

最佳答案

您提供的更新示例只会匹配“3”,而不是您描述的“13467”。如果您更改正则表达式以进行全局匹配,它将返回“36”而不是“13467”。

您的第一个示例也没有输出任何内容。

您只是想匹配正则表达式并循环匹配吗?

如果是,

var text = '1ab2cb3cd4ab5cb6cd7';
var matches = text.match(/(\d)/g);
for (i=0; i<matches.length; i++) {
   alert(matches[i]);
}

关于javascript - 如何在 javascript 的替换中循环遍历正则表达式的匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1261985/

相关文章:

javascript - Echarts堆积条形图如何处理数据

javascript - 我的代码是否违反了 GOOGLE adsense 条款和条件

javascript - 将表单输入更改为仅在复制元素时读取

javascript - django rest framework API编辑功能

php - preg_match 只给出一个匹配项

java - 替换字符串中的重复子串

javascript - 递归实现函数reduce javascript

javascript - 使用 javascript 连接 php 变量

javascript - 如何使用 javascript 提取模式并将其嵌入到 span 元素中?

python - 根据字符串位置将 Pandas 系列分解为多个 DataFrame 列