我想检查一个特定格式的字符串,如果匹配,则为字符串的某些部分的变量赋值。
例如,字符串格式为'num_{month}_{year}_10p'
,字符串为'num_october_16_10p'
。我想将变量字符串部分({month}
和{year}
)分配给变量。我事先不知道确切的字符串格式所以我写了简单的函数:
function string(string, regexp, monthPart, yearPart) {
if(!(regexp instanceof RegExp) || !regexp.test(string)) {
return false;
}
// I know that delimiter is underscore
var parts = string.split('_');
return {
month: parts[month],
year: parts[year]
};
}
并根据情况使用test('num_october_16_10p', /num_[a-z]{3,9}_[0-9]{2}_10p/, 1, 2);
生成正则表达式。
有更好的方法吗?仅使用regexp?如何支持任何字符串格式(没有特定的分隔符\ split()
)?
答案 0 :(得分:1)
您可以使用相同的正则表达式通过使用捕获组来匹配和提取“变量字符串部分”。您可以使用要捕获的标记周围的括号创建捕获组。您可以修改现有的正则表达式以匹配num_october_16_10p
,如下所示:num_([a-z]{3,9})_([0-9]{2})_10p
。然后,您可以将其与
import re
regex = re.compile(r'num_([a-z]{3,9})_([0-9]{2})_10p')
matches = regex.match('num_october_16_10p')
matches.group(0) # 'num_october_16_10p'
matches.group(1) # 'october'
matches.group(2) # '16'
matches.groups() # ('october', '16')
由于您似乎正在动态生成匹配的正则表达式,因此您应该能够添加捕获组。
答案 1 :(得分:1)
这适用于任何合理的分隔符和顺序,但要求月份名称为完整的英文名称或三个字母的缩写。年份可以是2位数字或4位数字。如果一个字符串包含多个可能的匹配,则只考虑第一个:
function extractDateParts(s) {
return {
month: (s.match(/([^a-z]|^)(jan(uary)?|feb(ruary?)|mar(ch?)|apr(il)?|may|june?|july?|aug(ust)?|sep(tember)?|oct(ober)?|nov(ember)?dec(ember)?)(?![a-z])/i) || [])[2],
year: +(s.match(/([^a-z0-9]|^)(\d\d(\d\d)?)(?![a-z0-9])/) || [])[2] || undefined
};
}
console.log(extractDateParts('num_october_16_10p'));
答案 2 :(得分:0)
涵盖所有案例
指数4将是月份,而指数5将是年份。
const regex = /(_|(\w+|^))(_|^)(\w+)_(\d+)(_|$)/gm;
const str = `num_october_16_10p
util_time_october_17
october_17_10p_num`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}