使用版本号为js的regalr表达式解析字符串



我有两种不同格式的字符串,比如下面我如何在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,一个数字,以及除[]之外的任何零零个或更多个字符
  • ]-一个]字符

最新更新