从javascript中的字符串中过滤版本号?

时间:2018-10-21 03:42:39

标签: javascript regex

我在这里找到了一些有关从字符串中提取版本号的线程,但没有一个完全符合我的要求。

如何使用javascript / regex从字符串中过滤出以下版本号?

Title_v1_1.00.mov过滤器1

v.1.0.1-Title.mp3过滤器1.0.1

Title V.3.4A.过滤器3.4A

V3.0.4b mix v2过滤器3.0.4b

因此,请查找第一个出现的“ v”或“ v”。后跟一个数字,再跟一个数字,字母或点,直到字符串的末尾或出现白色字符或出现一个没有数字的点(。)。

3 个答案:

答案 0 :(得分:1)

根据注释,要匹配字符串中的第一个版本号,您可以使用捕获组:

^.*?v\.?(\d+(?:\.\d+[a-z]?)*)

Regex demo

这将匹配:

  • ^断言字符串的开头
  • .*?匹配0+任何非贪婪字符
  • v\.?匹配v后跟一个可选点
  • (捕获组
    • \d+匹配1个以上的数字
    • (?:非捕获组
      • \.\d+[a-z]?匹配一个点,一个1+数字和一个可选字符a-z
    • )*关闭非捕获组并重复0次以上
  • )关闭捕获组

如果V.3.4A中的字符A仅位于最后一部分,则可以使用:

^.*?v\.?(\d+(?:\.\d+)*[a-z]?)

const strings = [
  "Title_v1_1.00.mov filters 1",
  "v.1.0.1-Title.mp3 filters 1.0.1",
  "Title V.3.4A. filters 3.4A",
  "V3.0.4b mix v2 filters 3.0.4b"
];

let pattern = /^.*?v\.?(\d+(?:\.\d+[a-z]?)*)/i;
strings.forEach((s) => {
  console.log(s.match(pattern)[1]);
});

答案 1 :(得分:0)

详细信息

  • v-字符“ v”
  • (?:\.)?-匹配“。”的1或0重复。

  • 版本捕获组
  • [0-9a-z\.]*-匹配字母数字和“。”字符
  • [0-9a-z]-确保版本号不以“。”结尾。
  • 您可以使用RegExp.exec()方法从字符串一对一中提取匹配项。

    const regex = /v(?:\.?)([0-9a-z\.]*[0-9a-z]).*/gi;
    
    let str = [
      "Title_v1_1.00.mov filters 1",
      "v.1.0.1-Title.mp3 filters 1.0.1",
      "Title V.3.4A. filters 3.4A",
      "V3.0.4b mix v2 filters 3.0.4b"
    ];
    
    let versions = [];
    let v; // variable to store match
    
    for(let i = 0; i < str.length; i++) {
      // Executes a check on str[i] to get the result of first capturing group i.e., our version number
      if( (v = regex.exec(str[i])) !== null) 
        versions.push(v[1]); // appends the version number to the array
      
      // If not found, then it checks again if there is a match present or not
      else if(str[i].match(regex) !== null) 
        i--; // if match found then it loops over the same string again
    }
    
    console.log(versions);

    答案 2 :(得分:0)

    var test = [
      "Title_v1_1.00.mov filters 1",
      "v.1.0.1-Title.mp3 filters 1.0.1",
      "Title V.3.4A. filters 3.4A",
      "V3.0.4b mix v2 filters 3.0.4b",
    ];
    console.log(test.map(function (a) {
      return a.match(/v\.?([0-9a-z]+(?:\.[0-9a-z]+)*)/i)[1];
    }));

    说明:

    /                       # regex delimiter
        v                   # letter v
        \.?                 # optional dot
        (                   # start group 1, it will contain the version number
            [0-9a-z]+       # 1 or more alphanumeric
            (?:             # start non capture group
                \.          # a dot
                [0-9a-z]+   # 1 or more alphanumeric
            )*              # end group, may appear 0 or more times
        )                   # end group 1
    /i                      # regex delimiter and flag case insensitive