正则表达式模式,用于将UUID与可选括号匹配

时间:2016-05-25 13:03:59

标签: regex visual-studio-2015

我找到了一个PCRE模式来匹配带有可选括号的UUID:

^(\{)?[0-9a-fA-F]{8}\-(?:[0-9a-fA-F]{4}\-){3}[0-9a-fA-F]{12}(?(1)\}|$)

此模式匹配:

{39E83341-4D11-4826-9020-847DDDE11C1B}
39E83341-4D11-4826-9020-847DDDE11C1B

但不匹配:

{39E83341-4D11-4826-9020-847DDDE11C1B
39E83341-4D11-4826-9020-847DDDE11C1B}

这正是我想要的。

似乎ECMAScript语法不支持这种模式(我使用的是Visual Studio 2015)。

有没有办法与ECMA实现相同的目标?或std::regex支持的其他语法之一?

提前thx! 佛瑞德

2 个答案:

答案 0 :(得分:2)

由于std::regex不支持条件结构,因此可以使用交替组将字符串与{...}匹配,而不使用它们:

^(?:\{[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\}|[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12})$

请参阅this regex demo

模式将匹配:

  • ^ - 字符串开头
  • (?: - 启动轮换组
    • \{ - {
    • [0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12} - UUID字符串
    • \} - 结束}
    • | - 或
    • [0-9a-fA-F]{8}-(?‌​:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12} - UUID字符串
  • ) - 交替小组结束
  • $ - 字符串结尾。

答案 1 :(得分:1)

您可以执行此操作,而无需使用两个lookahead assertions来说明替代方案:

^(?![^{}]*\})(?:(?=.*\})\{)?[0-9a-fA-F]{8}\-(?:[0-9a-fA-F]{4}\-){3}[0-9a-fA-F]{12}\}?$

<强>解释

^             # Start of string
(?![^{}]*\})  # Assert that no closing } occurs before an opening one.
(?:           # Match...
 (?=.*\})     # if a closing } follows later...
 \{           # an opening {
)?            # optionally.
[0-9a-fA-F]{8}\-(?:[0-9a-fA-F]{4}\-){3}[0-9a-fA-F]{12}
\}?           # Match an optional }
$             # at the end of the string.

测试live on regex101.com