我想要提取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我不知道如何匹配后面的字符,但排除下划线本身。这可能吗?
答案 0 :(得分:2)
由于JS不支持lookbehind
,我能想到的唯一方法是使用这样的组。
正则表达式: _([^_]+)
并使用\1
或$1
捕获论坛。
<强> Regex101 Demo 强>
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;
使用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);