正则表达式多重匹配字符串

Regex multi match on string

我试图用一个正则表达式匹配多个值。

我想提取标志和值(如果存在),但是我想为用户提供以多种不同方式键入标志的能力。

npm start search
npm start search=test-string
npm start search="test"
npm start search='test'
npm start search="test, test-string"
npm start search=' test,test '

我希望能够剖析标志和 = 之后的值,在等于之后它可以只是一个单词或多个值,用单引号或双引号中的逗号分隔。

这是我试过的方法

(^[^=]+)\=([^'"].*)?

(粗体)是我要匹配的内容,第 1 组是关键字,第 2 组是可选的搜索值。

npm 开始 搜索

npm start search=test-string

npm 开始 搜索="测试"

npm start search='test'

npm start search="test, test-string"

npm start search=' test,test '

我试过使用负前瞻和后视但总是失败...

您需要将 = 设为可选。

如果您希望在值周围使用引号,但不将它们包含在第二个捕获组中,请将引号放在捕获组之前,并使其成为可选的。然后匹配捕获组中除引号外的任何内容。

^([^=\n]+)=?['"]?([^'"\n]*)

DEMO

在演示中,我从字符串中删除了引号,因为它们由 shell 解析,没有传递给 npm。我还必须将 \n 放在 [^] 中,这样它就不会跨多行匹配。

从值中剥离引号后,以下内容应为您提供标志和值:

 myStr.match (/^npm start ([^\s]+)\s*=?\s*(['"]?[^'"]+?['"]?)\s*?$/i)

或带引号

myStr.match (/^npm start ([^\s]+)\s*=?\s*([^\s]+)?\s*$/i)

如果你不需要匹配npm start就简单

  myStr.match (/\s*([^\s]+)\s*=?\s*([^\s]+)\s*?$/i)

尚未测试,可能需要更多调整。

试试这个:

(?<=npm start)([^=\n]+)(?:=?)(?:['"]+)?([^\n\'\"]+)?(?:[^\S\n]?)

https://regex101.com/r/i0aacp/10/