返回Javascript中正则表达式匹配()的位置?
有没有办法检索Javascript中regex match()结果字符串中的(起始)字符位置?返回一个具有返回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 以下是我的想法: //查找引用文本的起始和结束位置 //在双引
索引属性的对象:
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()
方法上的文档:
返回的数组有一个额外的输入属性,该属性包含
已解析的原始字符串。此外,它还有一个索引
属性,它表示中匹配项的从零开始的索引
字符串
在处理非全局正则表达式(即正则表达式上的nog
标志)时,.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