Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的正则表达式匹配单词集_Javascript_Regex - Fatal编程技术网

Javascript中的正则表达式匹配单词集

Javascript中的正则表达式匹配单词集,javascript,regex,Javascript,Regex,我需要编写一个正则表达式来在javascript中使用,这样我就可以匹配一组连续的三个单词。这三个词是可变的,称为“before”、“error”、“after”。问题是“错误”总是存在的,但因为它可以是句子开头或结尾的锚,“之前”或“之后”可能会丢失。因此,为了说明: 如果before=“this”after=“that”error=“fail” 在句子中:test=“this fail that,但fail不是结果的一部分,但在类似这样的情况下,fail也可以是结果的一部分” 结果将是: t

我需要编写一个正则表达式来在javascript中使用,这样我就可以匹配一组连续的三个单词。这三个词是可变的,称为“before”、“error”、“after”。问题是“错误”总是存在的,但因为它可以是句子开头或结尾的锚,“之前”或“之后”可能会丢失。因此,为了说明:

如果
before=“this”after=“that”error=“fail”

在句子中:
test=“this fail that,但fail不是结果的一部分,但在类似这样的情况下,fail也可以是结果的一部分”

结果将是:

this fail that
this fail
其中只有两个正确返回,因为它们有“错误”字和两个副词中的至少一个。它们可以是单词之间的符号,因为我不知道标点符号

我正在尝试学习RegEx,但到目前为止,我只设法用类似以下内容检索错误单词:
newregexp(“\\b”+motereur+”\\b”,“gi”)

我对这三个词的尝试似乎并不正确:

pattern = @"(?:^\W*|(?<"+before+">\w+)\W+)" + error + @"(?:\W+(?<"+after+">\w+)|\W*$)";
pattern=@“(?:^\W*|)(?\W+\W+)”+错误+@“(?:\W+(?\W+)\W*$)”;
作为模式,如果在我的代码中取自C#中的一个示例,并且在Javascript中需要它,我不知道这是否是导致他失败的原因


如何使用简单的正则表达式来实现这一点?然后,目的是替换语句返回的部分(我已经为此编写了函数,我只使用这个正则表达式失败)。

如果正确理解问题,请尝试
(this\s+fail\s+that | this\s+fail | fail\s+that)
,因为您在JS中使用了该模式,您需要使用构造函数表示法并使用编号的捕获组,而不是
(?…)
命名组:

var before=“this”,before=“that”,error=“fail”;
var re=RegExp((?:^\\W*|)(“+before.replace(/[.+?^${}()[\]\]\]/g,“\\$&”)+”\\W+“+错误。replace(/[.+?^${}()[\]\\]/g,“\\$&”)+”(?:\\W+(“+before.replace(/[.+.+}$\\\\\\\\\\]\\\\]/g,“\$”)”)\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]]/g;
var str='此失败即失败,但失败不是结果的一部分,但在类似于此失败的情况下可以失败';
var-m;
while((m=re.exec(str))!==null){
document.body.innerHTML++=m[0]+“
”;
}
使用regexp和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;
}

在我的例子中,它们是可变的,在之前,在错误之后。我要试试看。它们可以在单词之间有符号,这将匹配字符串中任何位置的
fail that
,而在没有
的情况下,如果我理解正确,它应该只在字符串的开头匹配。我没有完全理解这个问题。如果是,请使用
(this\W+fail\W+that | this\W+fail$| ^fail\W+that)
如果除A-Z、A-Z、0-9或uu外的任何字符都被视为符号。如果您使用的是命名捕获组,则JS不支持它们。“你在找什么,对吧?”维克托斯特里比(WiktorStribiżew)真是太遗憾了。但它解释了为什么它不起作用。就你的正则表达式而言,它的前后位置在哪里?因为没有他们,我会得到一些我不想要的匹配。你回答的问题是失败是常见的,像“但失败是”这样的结果不应该被视为好结果,因为他周围没有旁白,只有另外两个词。好的,
fail
在那里,只要显示
m[0]
,但是我不明白
的问题,但是失败是
。你的意思是所有的上下文词都设置好了吗?必须被当作参数吗?请检查这个更新的代码片段。snipet看起来真的很好。我将尝试使用一些case,并查看结果
.replace(/[.*+?^${}()|[\]\\]\]/g,\\$&”)
是必要的,如果
之前有一个特殊的regex元字符,如
+
等。这些字符必须转义(a
\
应该在这些符号之前插入,以便它们被视为文字符号)。好的,这就是我所需要的全部。谢谢,我有一些错误,但它来自JS,我将能够自己更正它们。这对于“this,fail”的情况不起作用因为后面的锚不在那里,因为fail是句子的结尾。如果
之前
,或者
之后
或者
错误
包含特殊的正则元字符,这将不起作用。此外,应该使用
\\s
,而不是构造函数符号中的
\\\s
。如果需要所有标点符号,可以用[\\\s,.;:!?]*另外,3个斜杠可以正常工作,而你的2个斜杠不能:试试。@ADreNaLiNe DJ:我不必试试,我总是用双斜杠在JS中的C字符串中引入文字转义符号。在你的示例中,你是在“简单字符串”中。在这里,我们要处理的是表示regexp和双斜杠的字符串不足以使其正常工作。如果不尝试,您将永远看不到。我尝试了两个(2和3个斜杠),结果不同。只有3个斜杠有效。