我有两种不同格式的字符串,比如下面我如何在js中编写RegExp来解析信息,以在Package:
下获得appName1-v10.20.
?
//example string
const twoMatchString = '[Package: [appName1-v10.20.1](https://github.com/appName1/1111), [appName2-v20.15.10](https://github.com/appName2/aaa)]rn[asdsad: asdas]rni am description on PR'
const oneMatchString = '[Package: appName1-v10.20.1](https://github.com/appName1/1111)rn[asdsad: asdas]rni am description on PR'
const reg = /[Package:s?(.+?,?)]/g
const twoMatch = twoMatchString.matchAll(reg);
const oneMatch = oneMatchString.matchAll(reg);
console.log(twoMatch ) // wish to have ["appName1-v10.20.1", "appName2-v20.15.10"]
console.log(oneMatch) // wish to have ["appName1-v10.20.1"]
使用matchAll
返回一个RegExpStringIterator
。
在本页中,有一些示例如何使用Array.from
将值获取到数组中
如果支持正面查找(请参阅本页了解浏览器支持(:
(?<=[Package:.*?)[^s][-]+-[^][]+(?=])
(?<=[Package:.*?)
向左断言[Package:
[^s][-]+
匹配除[
]
-
或空白字符之外的非空白字符-
匹配-
[^][]+
匹配除[
和]
之外的任何字符的1+倍- CCD_ 17正向前瞻以断言右侧的CCD_ 18
Regex演示
const oneMatchString = '[Package: [appName1-v10.20.1](https://github.com/appName1/1111), [appName2-v20.15.10](https://github.com/appName2/aaa)]rn[asdsad: asdas]rni am description on PR'
const twoMatchString = '[Package: [appName1-v10.20.1](https://github.com/appName1/1111)rn[asdsad: asdas]rni am description on PR'
const reg = /(?<=[Package:.*?)[^s][-]+-[^][]+(?=])/g;
const twoMatch = Array.from(twoMatchString.matchAll(reg), s => s[0]);
const oneMatch = Array.from(oneMatchString.matchAll(reg), s => s[0]);
console.log(twoMatch) //["appName1-v10.20.1", "appName2-v20.15.10"]
console.log(oneMatch) // ["appName1-v10.20.1"]
或者更严格的版本
(?<=[Package:.*?)[^s-]+-vd+(?:.d+)*(?=])
regex演示
您可以使用
const extract = (text) => {
const package = /[Package:((?:,?s*[?[^][]+]([^()]*))*)/.exec(text)?.[1]
return package ?
Array.from(package.matchAll(/(?:^|[)([^][]*-vd[^][]*)]/g), x => x[1].trim()) : ""
}
查看JavaScript演示:
const extract = (text) => {
const package = /[Package:((?:,?s*[?[^][]+]([^()]*))*)/.exec(text)?.[1]
return package ?
Array.from(package.matchAll(/(?:^|[)([^][]*-vd[^][]*)]/g), x => x[1].trim()) : ""
}
const oneMatchString = '[Package: [appName1-v10.20.1](https://github.com/appName1/1111), [appName2-v20.15.10](https://github.com/appName2/aaa)]rn[asdsad: asdas]rni am description on PR'
const twoMatchString = '[Package: appName1-v10.20.1](https://github.com/appName1/1111)rn[asdsad: asdas]rni am description on PR'
console.log( extract(oneMatchString) ) // ["appName1-v10.20.1", "appName2-v20.15.10"]
console.log( extract(twoMatchString) ) // ["appName1-v10.20.1"]
[Package:((?:,?s*[?[^][]+]([^()]*))*)
正则表达式与匹配
[Package:
-[Package:
字符串((?:,?s*[?[^][]+]([^()]*))*)
-第1组:以下模式序列出现零次或多次:,?s*
-可选的,
和零个或多个空白[?
-可选[
[^][]+
-除[
和]
之外的一个或多个字符](
-](
字符串[^()]*
-除(
和)
之外的零个或多个字符)
-一个)
字符
(?:^|[)([^][]*-vd[^][]*)]
正则表达式提取版本:
(?:^|[)
-字符串开始或[
([^][]*-vd[^][]*)
-第1组:除[
和]
之外的任何零个或多个字符,-v
,一个数字,以及除[
和]
之外的任何零零个或更多个字符]
-一个]
字符