【问题标题】:Match regex in any order in Golang在 Golang 中以任何顺序匹配正则表达式
【发布时间】:2020-02-02 20:46:02
【问题描述】:

我有这样的事情:

option name [p1|p2|p3] | [p4]

其中 optionname 是必填项。 option 必须完全匹配,而 name 对任何 ASCII 字符组合都有效。如果匹配,这两个之后的任何字符串都是可选的,它可以以任何顺序出现。所以,它应该匹配:

option name1 p1
option name1 p1 p4
option name1 p4 p1

我的正则表达式尝试:

^(option)\s+(([a-zA-Z0-9]+))\s?(((p1|p2|p3)?)\s?((p4))?)\s?$

如果以特定顺序提供可选字符串,则此方法有效,例如:

option name1 p1 p4
option name1
option name1 p1
option name1 p4

但是这个不行:

option name1 p4 p1

有没有办法编写正则表达式来支持这些可选字符串的任意顺序?

编辑: p1,p2,p3,p4 只是举例。它可以是任何提供的确切字符串,例如foo,bar,baz。

更多说明:

name 可以是任何字符串。在完美的场景中,它应该不同于 foo、bar、baz 和其他选项。

【问题讨论】:

  • 那么name1p1 的区别是什么?你有白名单吗? option p1 会发生什么?
  • option jhfgudfbs4 ^%#*$) 有效吗?
  • 它应该会失败。选项和名称是必需的。正如我在问题中所写的那样,之后的其他选项应该完全匹配。我会更新我的问题,所以很清楚。
  • 目前还不清楚。您声明“虽然 name 对任何 ASCII 字符组合都有效”。 p1 是一个 ASCII 字符组合。
  • 你的意思是指定name后面必须跟一个数字吗?

标签: regex go regex-lookarounds


【解决方案1】:

如果您想同时匹配这两个变体,您可以使用一个或| 来列出这两个变体中的每一个。

要使第二部分成为可选,您可以使用可选的非捕获组(?:...)?

没有所有捕获组的示例:

^option\s+[a-zA-Z0-9]+(?:\s?(?:(?:foo|bar|baz)(?:\s?test)?|test(?:\s?(?:foo|bar|baz))?))?$

部分看起来像

  • ^ 字符串开始
  • option\s+[a-zA-Z0-9]+ 匹配选项,1+ 空白字符和 a+ 字符 a-zA-Z 或数字 0-9
  • (?:非捕获组
    • \s? 匹配可选的空白字符
    • (?:非捕获组
      • (?:foo|bar|baz)(?:\s?test)? 匹配例如 for、bar 等和可选测试
      • |或者
      • test(?:\s?(?:foo|bar|baz))? 匹配测试和可选的 foo、bar 等
    • )关闭非捕获组
  • )?关闭非捕获组,使整个部分可选
  • $字符串结束

Regex demo

【讨论】:

  • 感谢您的回答。抱歉误导性问题:( p1,p2,p3 只是示例。在我的场景中,它应该匹配不同的字符串,例如 foo baz bar。
  • 为什么在问题和正则表达式中使用p?在这种情况下,您必须列出所有选项而不是字符类,但仍然使用替换部分来匹配左侧之一和右侧之一,反之亦然。
  • 我试图简化它。由于我不是正则表达式专家,因此我忽略了这种可能性。我会更新我的问题。
  • @coder 你是这个意思吗? regex101.com/r/NBgyZe/1
  • 也非常感谢您的解释 :) 不能投票两次 :)
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多