使用正则表达式在Javascript中的字符串中的每个下划线后获取每个“单词”

时间:2016-03-24 20:37:35

标签: javascript regex

我想要提取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"]

我想知道是否有办法纯粹使用正则表达式?我所管理的最好的是:

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

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

3 个答案:

答案 0 :(得分:2)

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

正则表达式: _([^_]+)并使用\1$1捕获论坛。

<强> Regex101 Demo

&#13;
&#13;
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);
}
&#13;
<div id="match">

</div>
&#13;
&#13;
&#13;

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

但JS需要很长时间。杀了我的页面三次。会做一个很好的ReDoS漏洞利用

正则表达式 (?=_([A-Za-z0-9]+))并使用\1$1捕获论坛。

<强> Regex101 Demo

答案 1 :(得分:2)

您可以使用捕获组(_([^_]+))并在循环中使用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)

答案 2 :(得分:1)

为什么你认为你需要正则表达式?一个简单的拆分将完成这项工作:

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