获取已知格式的字符串的可变部分

时间:2017-07-31 14:14:02

标签: javascript regex

我想检查一个特定格式的字符串,如果匹配,则为字符串的某些部分的变量赋值。

例如,字符串格式为'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())?

3 个答案:

答案 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)

涵盖所有案例

  • num_october_16_10p
  • util_time_october_17
  • october_17_10p_num

指数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}`);
    });
}