【问题标题】:Regex multi match on string正则表达式多匹配字符串
【发布时间】:2018-04-13 01:13:45
【问题描述】:

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

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

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 搜索=测试字符串

npm start 搜索="测试"

npm start 搜索='测试'

npm start search="test, test-string"

npm start 搜索=' test,test '

我尝试过使用负前瞻和后置,但一直失败......

【问题讨论】:

  • = 应该是可选的吗?
  • 是的,标志的值大小是可选的,标志可以不存在值(=)
  • = 后面没有?,所以不是可选的。
  • 我知道,但它不在匹配组中,第一个匹配将匹配所有内容,直到 = 符号
  • 但是如果=不匹配,根本就没有匹配,所以没有设置捕获组。

标签: javascript regex string negative-lookahead


【解决方案1】:

您需要将= 设为可选。

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

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

DEMO

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

【讨论】:

  • 嗨,伙计,到目前为止,我确实需要我发送的示例,正​​在运行的脚本是在 npm 脚本运行之前发生的(愚蠢的抽象)所以我绝对需要单引号和双引号工作...
  • 这是我最接近的:regex101.com/r/zvphYw/1,但它仍然匹配第 2 组中的单引号
  • 所以您正在尝试解析包含 npm 命令的脚本,您不是在 npm 运行的 Javascript 中执行此操作吗?
  • 在这种情况下,您不应该在正则表达式的开头使用^,因为您正在尝试匹配不在行开头的内容。
  • 它是由节点优先处理的,很难解释,我的例子中没有包含npm start 作为一个更简单的例子,后面很容易添加它
【解决方案2】:

试试这个:

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

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

【讨论】:

  • 这匹配标志和一组中的所有值,也匹配引号。 regex101.com/r/4wGMF6/3 这很接近,但它仍然匹配引号
  • 谢谢,这可以工作,但是@barmar 的版本更干净
【解决方案3】:

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

 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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多