Javascript中的RegEX来匹配单词集

RegEX in Javascript to match set of word

本文关键字:单词集 中的 RegEX Javascript      更新时间:2023-09-26

我需要编写一个正则表达式以在我的JavaScript中使用,以便我可以匹配一组连续的三个单词。这三个词将变量称为"之前","错误","之后"。问题是"错误"总是存在的,但由于它可以是句子开头或结尾的锚点,因此可能会缺少"之前"或"之后"。所以为了说明:

如果before= "this" after = "that" error="fail"

在句子中:test = "this fail that, but fail is not part of the result but can be in the case it is like this, fail"

结果将是:

this fail that
this fail

其中只有 2 个正确返回,因为它们具有"错误"字和两个边字中的至少一个。它们可以是单词之间的符号,因为我没有得到标点符号。

正在尝试学习正则表达式,但到目前为止,我只能设法检索错误词,例如:new RegExp("''b" + motErreur + "''b", "gi");

我为这三个词所做的尝试似乎无法正常工作:

pattern = @"(?:^'W*|(?<"+before+">'w+)'W+)" + error + @"(?:'W+(?<"+after+">'w+)|'W*$)";

作为模式,如果取自我的代码中的 C# 示例并在 Javascript 中需要它,我不知道这是否是让他失败的原因。

我怎样才能用一个简单的正则表达式来做到这一点? 然后目的是替换句子返回的部分(我已经为此编写了函数,我只在这个正则表达式中失败)。

由于您在 JS 中使用模式,因此您需要使用构造函数表示法并使用编号的捕获组而不是(?<name>....)命名的捕获组

var before= "this", after = "that", error="fail";
var re = RegExp("(?:^''W*|(" + before.replace(/[.*+?^${}()|[']'']/g, "''$&") + ")''W+)" + error.replace(/[.*+?^${}()|[']'']/g, "''$&") + "(?:''W+(" + after.replace(/[.*+?^${}()|[']'']/g, "''$&") + ")|''W*$)", "g"); 
var str = 'this fail that, but fail is not part of the result but can be in the case it is like this fail';
var m;
while ((m = re.exec(str)) !== null) {
    document.body.innerHTML += m[0] + "<br/>";
}

注意:

  • 由于您是动态构建模式的,因此需要使用构造函数表示法 ( RegExp(...)
  • 在构造函数表示法中,'必须加倍
  • 由于key可以包含特殊的正则表达式元字符,因此必须对其进行转义才能将其视为文字(我添加了.replace(/[.*+?^${}()|[']'']/g, "''$&")
  • 上下文词在m[1]m[2]中。使用前检查它们是否未undefined

如果正确理解了问题,请尝试(this's+fail's+that|this's+fail|fail's+that)

使用正则表达式和 exec 方法来查找每个匹配项:

var rgx = new RegExp("(" + before + "'''s*" + error + "'''s*(" + after + ")*)", "g")
var resultArray = rgx.exec(test);

resultArray 中的匹配项是索引 1 处的项(例如 resultArray[1])。在 resultArray 不为 null 时调用 exec 方法以查找所有匹配项。

所以你可以写一个函数:

function getMatches(str)
{
    var before= "this";
    var after = "that";
    var error = "fail";
    var array = new Array();
    var rgx = new RegExp("(" + before + "'''s*" + error + "'''s*(" + after + ")*)", "g")
    var matches = rgx.exec(test);
    while(matches != null)
    {
        array.push(matches[1]);
        matches = rgx.exec(test);
    }
    return array;
}