Javascript 如何创建一个函数来获得一个特定字符串前后7个单词的匹配?

Javascript 如何创建一个函数来获得一个特定字符串前后7个单词的匹配?,javascript,regex,string,function,Javascript,Regex,String,Function,您好,我想做一个javascript函数来返回一个特定关键字的数学前后7个单词 我做了如下尝试: function myFunction(text) { b=text.match("(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,7}"+text+"(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,7}"); return b; 然而,当我在我的文本“创建”中搜索时,我得到了: create 我期望的结果是: the Community, and

您好,我想做一个javascript函数来返回一个特定关键字的数学前后7个单词

我做了如下尝试:

function myFunction(text) {

    b=text.match("(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,7}"+text+"(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,7}");

    return b; 
然而,当我在我的文本“创建”中搜索时,我得到了:

create
我期望的结果是:

the Community, and view patterns you create or favorite in My Patterns. Explore results
我的完整代码如下所示,对应的字符串名为Text,因此我非常感谢您为完成此任务提供的支持

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>
<script>


var Text='RegExr was created by gskinner.com, and is proudly hosted by Media Temple. Edit the Expression & Text to see matches. Roll over matches or the expression for details. PCRE & Javascript flavors of RegEx are supported. The side bar includes a Cheatsheet, full Reference, and Help. You can also Save & Share with the Community, and view patterns you create or favorite in My Patterns. Explore results with the Tools below. Replace & List output custom results. Details lists capture groups. Explain describes your expression in plain English.'
function myFunction(text) {

    b=text.match("(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,7}"+text+"(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,7}");

    return b; 
}
document.getElementById("demo").innerHTML = myFunction("create");
</script>

</body>
</html>

var Text='RegExr由gskinner.com创建,并由Media Temple自豪地主持。编辑表达式和文本以查看匹配项(&T)。滚动匹配或表达式以获取详细信息。支持正则表达式的PCRE和Javascript风格。侧栏包括备忘单、完整参考和帮助。您还可以保存并与社区共享,并查看您在“我的模式”中创建或喜爱的模式。使用以下工具探索结果。替换&列出输出自定义结果。详细信息列表捕获组。解释用通俗易懂的英语描述你的表情 函数myFunction(文本){ b=文本匹配((?:[a-zA-Z'-]+[^a-zA-Z'-]+{0,7}“+text+”(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,7}); 返回b; } document.getElementById(“demo”).innerHTML=myFunction(“创建”);
正则表达式不是执行此类任务的好工具。我建议使用
split
将句子拆分为一个单词数组,然后使用
indexOf
找到匹配的单词并打印相邻的单词

下面是一个工作示例:

let-station=“诸如此类的社区,并查看您在我的模式中创建或喜爱的模式。探索结果诸如此类的”;
让单词=句子。拆分(“”);
让index=words.indexOf(“创建”);
让结果=[];
如果(索引>-1){
对于(i=索引-7;i<(索引+8);i++){
结果推送(字[i]);
}
}

console.log(result.join(“”)
您可以将文本拆分为单词数组并找到单词的索引,然后使用
数组#slice()
数组#join()

如果word在下列空格前包含此类标点符号,则Following还会删除
标点符号以进行匹配,并规范大小写匹配

var Text='RegExr由gskinner.com创建,并由Media Temple自豪地托管。编辑表达式和文本以查看匹配项(&T)。滚动匹配或表达式以获取详细信息。支持正则表达式的PCRE和Javascript风格。侧栏包括备忘单、完整参考和帮助。您还可以保存并与社区共享,并查看您在“我的模式”中创建或喜爱的模式。使用以下工具探索结果。替换&列出输出自定义结果。详细信息列表捕获组。解释用通俗易懂的英语描述你的表情
变量项='创建',
单词=文本。拆分(“”),
index=words.findIndex(s=>s.replace(/,| \.$/,'').toLowerCase()==term.toLowerCase()),
开始=索引>6?指数-7:0;
var res=words.slice(开始,索引+8).join(“”)

console.log(res)
您的尝试存在一些问题:

  • 正则表达式不是字符串。如果要从字符串创建正则表达式,则需要使用
    new RegExp()

  • 变量混淆了。一个变量称为Text,另一个变量称为Text,这没有帮助。因此,您最终尝试在
    文本
    中查找
    文本
    ,这显然不是您想要的。因此,使用不同的变量名,并将它们传递给函数

  • 您搜索的单词(“create”)将首先与输入开头附近的“created”匹配。由于正则表达式指定以下内容都是可选的(
    {0,7}
    ),这将被视为匹配!为了避免这种情况,需要在字符串后面或末尾至少有一个单词中断。匹配词前面的部分也是如此:它不应该是完全可选的。使用
    {1,7}
    并且不需要其中的单词部分(
    *
    )。分别作为备选方案
    ^
    $
    给出

  • 当存在匹配项时,
    match
    方法将返回一个数组,因此您需要返回该数组中的值(如果存在匹配项)

  • 因此,只需很少的更改,您的代码就可以像这样工作:

    var text='RegExr由gskinner.com创建,并由Media Temple自豪地主持。编辑表达式和文本以查看匹配项(&T)。滚动匹配或表达式以获取详细信息。支持正则表达式的PCRE和Javascript风格。侧栏包括备忘单、完整参考和帮助。您还可以保存并与社区共享,并查看您在“我的模式”中创建或喜爱的模式。使用以下工具探索结果。替换&列出输出自定义结果。详细信息列表捕获组。解释用通俗易懂的英语描述你的表情
    函数myFunction(文本,查找){
    b=text.match(新的RegExp((?:(?:[a-zA-Z'-]*[^a-zA-Z'-]+){1,7}| ^)“+find+”(?:(?:[^a-zA-Z'-]+[a-zA-Z'-]*){1,7}|$));
    返回b&b[0];
    }
    
    log(myFunction(文本“create”)您的正则表达式非常适合我

    你的问题在于你有两个名字相似的变量:
    Text
    Text

    b=text.match
    更改为
    b=text.match
    ,因为您希望与函数外部的字符串进行匹配。当前,将表达式与仅包含所需单词的字符串相匹配

    当您进行更改时,还需要查找其他内容:match返回第一个出现的
    “create”
    ,它恰好是第三个单词的子字符串。您可能需要考虑修改表达式以防止部分匹配。

    这个如何:

    (?:\w+[,\.]? ){6}create(?:[\,.]? \w+){7}
    
    • (?:\w+[,\.]?)
      是一个后跟逗号或点以及空格的单词
    • {6}
      指示该单词将出现6次
    • 创建
      function myFunction(text) {
          b=Text.match(new RegExp('(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,7}\b' + text + '\b(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,7}');
          return b; 
      }