为什么我的 SemVer NSRegularExpression 运行 不会?

Why won't my SemVer NSRegularExpression run?

我正在尝试制作一个匹配 semantic version (SemVer) 2.0.0 的正则表达式。这是我的第一次尝试:

^(?'major'\d+)\.(?'minor'\d+)(?:\.(?'patch'\d+))?(?:-(?'preRelease'(?:(?'preReleaseId'[0-9A-Za-z-]+)\.?)+))?(?:\+(?'build'(?:(?'buildId'[0-9A-Za-z-]+)\.?)+))?$

RegEx101

这通过了我的冒烟测试,但是当我尝试将其实际设为 NSRegularExpression 时,我得到了:

Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=2048 "The value “^(?'major'\d+)\.(?'minor'\d+)(?:\.(?'patch'\d+))?(?:-(?'preRelease'(?:(?'preReleaseId'[0-9A-Za-z-]+)\.?)+))?(?:\+(?'build'(?:(?'buildId'[0-9A-Za-z-]+)\.?)+))?$” is invalid." UserInfo={NSInvalidValue=^(?'major'\d+)\.(?'minor'\d+)(?:\.(?'patch'\d+))?(?:-(?'preRelease'(?:(?'preReleaseId'[0-9A-Za-z-]+)\.?)+))?(?:\+(?'build'(?:(?'buildId'[0-9A-Za-z-]+)\.?)+))?$}: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-900.0.74.1/src/swift/stdlib/public/core/ErrorType.swift, line 181

为什么?我在网上找不到任何关于 NSRegularExpression expects/accepts 的信息,所以我不知道我在这里做错了什么。


Swift代码:

public static let regex = try! NSRegularExpression(pattern:
    "^(?'major'\d+)\." +
    "(?'minor'\d+)" +
    "(?:\.(?'patch'\d+))?" +
    "(?:-(?'preRelease'(?:(?'preReleaseId'[0-9A-Za-z-]+)\.?)+))?" +
    "(?:\+(?'build'(?:(?'buildId'[0-9A-Za-z-]+)\.?)+))?$",
                                                   options: .caseInsensitive)

您似乎正试图在正则表达式中使用命名组。 NSRegularExpression 命名组使用尖括号而不是正则表达式中的单引号。尝试使用语法

`(?<groupName>...)`

为您命名的捕获组。

这是符合该规范的正则表达式。我使用 PCRE 样式进行说明:命名组。您可能需要删除 <groupnames> 并从中创建普通组。 您可能需要添加 ^$ 以匹配字符串的开始和结束:

(?<version_core>(?<major>(?:[0-9]|[1-9][0-9]+))\.(?<minor>(?:[0-9]|[1-9][0-9]+))\.(?<patch>(?:[0-9]|[1-9][0-9]+)))(?:-(?<pre_release>(?:0|[1-9A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9A-Za-z-][0-9A-Za-z-]*))*))?(?:\+(?<build>[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?

Debuggex Demo