我在这里找到了一些有关从字符串中提取版本号的线程,但没有一个完全符合我的要求。
如何使用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”。后跟一个数字,再跟一个数字,字母或点,直到字符串的末尾或出现白色字符或出现一个没有数字的点(。)。
答案 0 :(得分:1)
根据注释,要匹配字符串中的第一个版本号,您可以使用捕获组:
^.*?v\.?(\d+(?:\.\d+[a-z]?)*)
这将匹配:
^
断言字符串的开头.*?
匹配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