如何在javascript中使用正则表达式在字符串中查找子字符串?

如何在javascript中使用正则表达式在字符串中查找子字符串?,javascript,regex,string,Javascript,Regex,String,我有一根像下面这样的线 Hello there how are you? 我想在字符串中查找子字符串“there how”。所以我会这样做 var str = "Hello there how are you?"; var term = "there how" var res = str.match("\\s" + term + "\\s"); // # /s is used to ensure the match should be an independent phrase 但现在的

我有一根像下面这样的线

Hello there how are you?
我想在字符串中查找子字符串“there how”。所以我会这样做

var str = "Hello there how are you?"; 
var term = "there how"
var res = str.match("\\s" + term + "\\s"); //  # /s is used to ensure the match should be an independent phrase
但现在的问题是,如果我得到字符串的一个变体,那么匹配就不会发生。例如,对于这样的字符串

如果单词之间有很大的空格

Hello there         how are you?
如果某些字母大写

Hello There How are you?
我想做的是确保只要子字符串'there how'作为一个单独的短语出现在字符串中,就不会像Hellothere那样。你好吗?或者你好你好吗?等等,我应该能找到匹配的

我怎样才能达到目标

多亏了@Wiktor Stribiżew,他在下面提出了这个解决方案

var ss = ["Hello there how are you?", "Hello there         how are you?", "Hello There How are you?"];
var term = "there how";
var rx = new RegExp("(?<!\\S)" + term.replace(/ /g, "\\s+") + "(?!\\S)", "i");
for (var i=0; i<ss.length; i++) {
    var m = ss[i].match(rx) || "";
    console.log(m[0]);
}
虽然这在在线nodejs编译器(如repl)中有效,但在常规javascript中不起作用

我在下面的javascript中得到了这一行的错误

var rx = new RegExp("(?<!\\S)" + term.replace(/ /g, "\\s+") + "(?!\\S)", "i");    

SyntaxError: invalid regexp group
我怎样才能实现我的目标?

?正则表达式字符串的一部分是导致错误的原因,它发生在不支持lookbehinds(甚至固定宽度lookbehinds)的常规JavaScript版本上。一种解决方法是只使用单词边界:

var rx = new RegExp("\\b" + term.replace(/ /g, "\\s+") + "(?!\\S)", "i");

假设您的术语以单词字符开头和结尾,\b应该足以涵盖您想要的行为。

许多浏览器仍然不支持lookback,因此您会遇到该错误。您可以使用以下方法:

var ss=[你好,你好吗?,你好,你好吗?,你好,你好吗?]; var术语=如何存在; var rx=new RegExp?:^ | \\s+term.replace/+/g,\\s++\\S、 胃肠道; var-m;
对于var i=0;i根据您希望返回结果的方式,您可以通过以下两种方式之一解决问题。如果您希望返回的搜索词与它在输入中显示的方式完全相同,那么可以将regex设置为更通用的选项1。但是,如果希望返回的结果与搜索词的格式匹配,可以先清理输入以删除多余的空格和大写

如上所述,分词应足以确定短语独立于输入中的其他单词

var ss=[你好,你好吗?,你好,你好吗?,你好,你好吗?,你好,你好,你好吗?] 函数buildRgxterm{ 让spaceFix=term.split'。加入'\\s+' 返回新的RegExp'\\b'+spaceFix+'\\b',i' } var generalizedSearchTerm=buildRGX如何 ss.forEachstr=>{ 让result=generalizedSearchTerm.execstr ifresult{ strmatch=结果[0], indexstart=result.index, indexend=indexstart+stratch.length console.logstrmatch、indexstart、indexend }否则{ 控制台。记录“未找到匹配项” } } //或者先对输入进行清理 控制台。日志'OR' 函数sanitizestr{return str.toLowerCase.replace/\s+/g',} var simpleSearchTerm=new RegExp'\\b'+where+'\\b' ss.forEachstr=>{ 让sanitizedString=sanitizestr console.logsimpleSearchTerm.execsanitizedString
} 下面是一个使用该术语作为正则表达式一部分的示例。设置变量来自

//从其他答案设置变量 var ss=[你好,你好吗?,你好,你好吗?,你好,你好吗?]; var术语=如何存在; //如果要在正则表达式中使用该术语,请将空格替换为\\s+1或更多空格 函数替换空间{ 返回s.replace//g,\\s+ } //创建正则表达式 var pattern=new RegExp`\\s${replaceSpacesterm}\\s` //比较前使用小写字母忽略大小写 //如果正则表达式也需要不区分大小写,那么也将replaceSpace的输出小写
console.logss.maps=>pattern.tests.toLowerCaseOh我明白了。所以javascript不支持lookbehind.ok!顺便问一下,有什么方法可以从字符串中获取捕获术语的开始和结束索引吗?是的,这是绝对可能的。我会用一个例子来更新答案。有什么方法可以从字符串中获取所捕获术语的开始和结束索引吗?@SouvikRay当然,我更新了答案,将其包括在内。使用exec返回一个对象,该对象包含作为属性之一的索引。这是开始索引,然后将匹配字符串的长度添加到开始索引中,就得到了结束索引。显然,这只适用于未初始化的版本,否则标记将关闭