javascript - 使用全局模式修饰符和前瞻

标签 javascript regex

我正在努力更好地理解正则表达式,所以即使有不同的、更好的解决方案(确实存在),我也不在乎。我想用正则表达式解决它。

特别是当我运行以下 js/regex 时:

$('#submitCode').click(function() {
    var codeInput = $('#codeInput').val();
    var ids = codeInput.match(/id="(.*?)"/);
    var classes = codeInput.match(/class="(.*?)"/);
    var output = classes[1].split(" ");
    output.push( ids[1] );
    console.log(output);
    });

在下面的 html 中,目标是返回 textarea#codeInput 中的所有 ids 和 css 类:

<textarea id="codeInput">
 <div id="test_id1" class="class1 class2">
  <div id="test_id2" class="class3 class4">test</div>
 </div>
</textarea>
<button id="submitCode">submit</button>

它在第一场比赛后停止,给我以​​下输出:

["class1", "class2", "test_id1"] 

经过一些研究,看起来全局修饰符是我想要的,但是当我这样添加它时:

    var ids = codeInput.match(/id="(.*?)"/g);
    var classes = codeInput.match(/class="(.*?)"/g);

这是输出:

["class="class3", "class4"", "id="test_id2""] 

当我想要的是:

["class1", "class2", "class3", "class4", "test_id1", "test_id2"] 

Here is the jsfiddle .

在我的研究中,我也开始阅读更多关于前瞻的内容,但我没有在我的正则表达式中看到 (?=) 模式,所以奖励积分给任何可以启发我的人如果不是前瞻性的,在我的陈述中实际上正在发生。

谢谢!

最佳答案

我认为在这种情况下,我会利用使用函数对正则表达式匹配结果进行操作的能力:

var output = [];
codeInput.replace(/(?:class|id)="(.*?)"/g, function(_, values) {
  values.split(" ").forEach(function(s) { output.push(s); });
});

.replace() 函数将调用您传递给它的函数,参数为匹配结果。第一个参数是整个匹配的子串,后面的参数是捕获组的值。

请注意,没有进行实际的替换;代码只是利用了这种行为。

关于javascript - 使用全局模式修饰符和前瞻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23326494/

相关文章:

javascript - 正则表达式 - 管道符(竖线)(|) 位于括号末尾/右括号之前

javascript - 匹配任何不以零结尾的数字的正则表达式

python - 从 pandas 字符串列中提取最多 N 个数字,前面或后面没有任何其他数字

javascript - 在 for 循环内同步 promise ?

javascript - 根据 JavaScript 变量更改链接

Javascript 哈希/转换函数名称

javascript - JS : Cross Browser Compatibility - my JS works in chrome, 不在 FF 中

javascript - 如何知道 HTMLMediaElement 何时完成

用于从字符串中提取日期的正则表达式

regex - 如何实现基于 NFA 或 DFA 的正则表达式匹配算法来查找所有匹配项?