获取每个'单词'在使用regex的Javascript字符串中的每个下划线之后

Getting each 'word' after every underscore in a string in Javascript using regex

本文关键字:字符串 Javascript 下划线 之后 单词 获取 regex      更新时间:2023-09-26

我想提取Javascript字符串中下划线后面的每个字母数字字符块。我目前使用字符串方法和正则表达式的组合来工作,如下所示:

var string = "ignore_firstMatch_match2_thirdMatch";    
var firstValGone = string.substr(string.indexOf('_'));
// returns "_firstMatch_match2_thirdMatch"
var noUnderscore = firstValGone.match(/[^_]+/g);
// returns ["firstMatch", "match2" , "thirdMatch"]

我想知道是否有一种纯粹使用regex的方法?我管理过的最好的是:

var string = "ignore_firstMatch_match2_thirdMatch";
var matchTry = string.match(/_[^_]+/g);
// returns ["_firstMatch", "_match2", "_thirdMatch"]

但这也会返回前面的下划线。如果你不能在JS中使用lookbehinds,我不知道如何匹配后面的字符,但排除了下划线本身。这可能吗?

您可以在循环中使用捕获组(_([^_]+))和RegExp#exec,同时将捕获的值推入数组:

var re = /_([^_]+)/g; 
var str = 'ignore_firstMatch_match2_thirdMatch';
var res = [];
 
while ((m = re.exec(str)) !== null) {
    res.push(m[1]);
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

请注意,使用带有用全局修饰符/g定义的正则表达式的string#match()将丢失所有捕获的文本,这就是为什么不能只使用str.match(/_([^_]+)/g)的原因。

由于JS中不支持lookbehind,我唯一能想到的方法就是使用这样的组。

Regex:_([^_]+)和使用'1$1的捕获组。

Regex101演示

var myString = "ignore_firstMatch_match2_thirdMatch";
var myRegexp = /_([^_]+)/g;
match = myRegexp.exec(myString);
while (match != null) {
  document.getElementById("match").innerHTML += "<br>" + match[0];
  match = myRegexp.exec(myString);
}
<div id="match">
</div>


使用lookahead的另一种方式是这样的。

但在JS中需要很长时间。三次杀死我的页面。将是一个很好的ReDoS漏洞

Regex:(?=_([A-Za-z0-9]+))和使用'1$1的捕获组。

Regex101演示

为什么您认为需要regex?一个简单的拆分就可以完成任务:

string str = "ignore_firstMatch_match2_thirdMatch";
IEnumerable<string> matches = str.Split('_').Skip(1);