返回Javascript中正则表达式匹配()的位置?

返回Javascript中正则表达式匹配()的位置?,javascript,regex,match,string-matching,Javascript,Regex,Match,String Matching,有没有办法检索Javascript中regex match()结果字符串中的(起始)字符位置?返回一个具有索引属性的对象: var match=/bar/.exec(“foobar”); 如果(匹配){ log(“在“+match.index”找到匹配项); }您可以使用字符串对象的搜索方法。这只在第一场比赛中有效,但在其他情况下会按照您所描述的进行。例如: "How are you?".search(/are/); // 4 以下是我的想法: //查找引用文本的起始和结束位置 //在双引

有没有办法检索Javascript中regex match()结果字符串中的(起始)字符位置?

返回一个具有
索引
属性的对象:

var match=/bar/.exec(“foobar”);
如果(匹配){
log(“在“+match.index”找到匹配项);

}
您可以使用
字符串
对象的
搜索
方法。这只在第一场比赛中有效,但在其他情况下会按照您所描述的进行。例如:

"How are you?".search(/are/);
// 4

以下是我的想法:

//查找引用文本的起始和结束位置
//在双引号或单引号中,支持转义字符,如\“\”
var str=“这是一个您可以“读取”的“引用”字符串”;
变量patt=/'(((?:\\.\.[^'])*)“\”((?:\.\.[^'])*)”/igm;
while(match=patt.exec(str)){
console.log(match.index+“”+patt.lastIndex);

}
此成员fn返回字符串对象中输入字的基于0的位置数组(如果有)

String.prototype.matching_positions = function( _word, _case_sensitive, _whole_words, _multiline )
{
   /*besides '_word' param, others are flags (0|1)*/
   var _match_pattern = "g"+(_case_sensitive?"i":"")+(_multiline?"m":"") ;
   var _bound = _whole_words ? "\\b" : "" ;
   var _re = new RegExp( _bound+_word+_bound, _match_pattern );
   var _pos = [], _chunk, _index = 0 ;

   while( true )
   {
      _chunk = _re.exec( this ) ;
      if ( _chunk == null ) break ;
      _pos.push( _chunk['index'] ) ;
      _re.lastIndex = _chunk['index']+1 ;
   }

   return _pos ;
}
现在试试

var _sentence = "What do doers want ? What do doers need ?" ;
var _word = "do" ;
console.log( _sentence.matching_positions( _word, 1, 0, 0 ) );
console.log( _sentence.matching_positions( _word, 1, 1, 0 ) );
您还可以输入正则表达式:

var _second = "z^2+2z-1" ;
console.log( _second.matching_positions( "[0-9]\z+", 0, 0, 0 ) );
这里可以得到线性项的位置索引。

来自字符串
.match()
方法上的文档:

返回的数组有一个额外的输入属性,该属性包含 已解析的原始字符串。此外,它还有一个索引 属性,它表示中匹配项的从零开始的索引 字符串

在处理非全局正则表达式(即正则表达式上的no
g
标志)时,
.match()
返回的值有一个
索引
属性…您所要做的就是访问它

var index = str.match(/regex/).index;
下面是一个示例,显示了它的工作原理:

var str='my string here';
var index=str.match(/here/).index;

警报(索引);// 这是我最近发现的一个很酷的功能,我在控制台上尝试了这个功能,它似乎可以工作:

var text = "border-bottom-left-radius";

var newText = text.replace(/-/g,function(match, index){
    return " " + index + " ";
});
返回:“边界6底部13左18半径”

所以这似乎就是你要找的

function trimRegex(str, regex){
    return str.substr(str.match(regex).index).split('').reverse().join('').substr(str.match(regex).index).split('').reverse().join('');
}

let test = '||ab||cd||';
trimRegex(test, /[^|]/);
console.log(test); //output: ab||cd


在现代浏览器中,您可以使用

RegExp.exec()
相比,这种方法的好处在于它不依赖于正则表达式是有状态的,如中所示

let regexp=/bar/g;
设str='foobarfoobar';
让matches=[…str.matchAll(regexp)];
匹配项。forEach((匹配)=>{
log(“在“+match.index”找到匹配项);
});
var str='my string here';
var-index=str.match(/hre/).index;

警报(索引);// 恐怕前面的答案(基于
exec
)在正则表达式与宽度0匹配的情况下似乎不起作用。例如(注意:
/\b/g
是应该查找所有单词边界的正则表达式):

var re=/\b/g,
str=“你好,世界”;
var-guard=10;
while((match=re.exec(str))!=null){
log(“在“+match.index”找到匹配项);
如果(保护--<0){
控制台错误(“检测到无限循环”)
打破
}

}
谢谢您的帮助!您能告诉我如何找到多个匹配项的索引吗?注意:使用
re
作为变量,并添加
g
修饰符都是至关重要的!否则你会得到一个无休止的循环。@OnurYıldırım-这里有一个JS的中间部分正在工作…我已经在IE5上测试过了…工作很好:@JimboJonny,嗯,我学到了一些新东西。我的测试用例返回未定义的
。这不是像您这样的搜索示例。@OnurYıldırım-删除
g
标志,它就会工作。由于
match
是字符串的函数,而不是正则表达式,因此它不能像
exec
那样是有状态的,因此如果您不寻找全局匹配,它只会像
exec
(即具有索引属性)一样对待它……因为这样状态就无关紧要了。
match.index+match[0].length
也适用于结束位置。非常好-@BeniCherniavsky Paskin,结束位置不是
match.index+match[0]。length-1
?@David,我指的是独占结束位置,例如
.slice()
.substring()
。如您所说,包含的端将减少1。(请注意,inclusive通常意味着匹配中最后一个字符的索引,除非它是一个空匹配,在匹配之前为1,并且可能在字符串外部为
-1
,在开始时为空匹配…)对于
patt=/.*/
它进入无限循环,我们如何限制它?请注意,替换函数也会添加捕获组,因此请注意,它始终是替换函数
参数
中倒数第二个条目的位置。不是“第二个论点”。函数参数为“完全匹配,组1,组2,…,匹配索引,完全字符串匹配”,这是不正确的
str.indexOf
这里只找到匹配捕获的下一个文本,不一定是匹配。JS regex支持对具有前瞻性的捕获之外的文本的条件。例如,
searchIndex(“foobarfoobaz”,“foo(?=baz)”,true)
应该给出
[6]
,而不是
[0]
。为什么`[].forEach.call(arr,function(element)`为什么不arr.forEach或arr.mapSo就像4年前(与您的不同,它是有效的)tks一样,
[…str.matchAll(regexp)]
很整洁
function trimRegex(str, regex){
    return str.substr(str.match(regex).index).split('').reverse().join('').substr(str.match(regex).index).split('').reverse().join('');
}

let test = '||ab||cd||';
trimRegex(test, /[^|]/);
console.log(test); //output: ab||cd
function trimChar(str, trim, req){
    let regex = new RegExp('[^'+trim+']');
    return str.substr(str.match(regex).index).split('').reverse().join('').substr(str.match(regex).index).split('').reverse().join('');
}

let test = '||ab||cd||';
trimChar(test, '|');
console.log(test); //output: ab||cd