我找到了一个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
支持的其他语法之一?
答案 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})$
模式将匹配:
^
- 字符串开头(?:
- 启动轮换组
\{
- {
[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.