【问题标题】:Why won't my SemVer NSRegularExpression run?为什么我的 SemVer NSRegularExpression 不能运行?
【发布时间】:2018-06-23 18:15:24
【问题描述】:

我正在尝试制作一个匹配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 期望/接受的信息,所以我不知道我在这里做错了什么。


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的代码
  • 好的...它不应该透露任何特别的东西

标签: swift cocoa runtime-error nsregularexpression semantic-versioning


【解决方案1】:

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

`(?<groupName>...)`

为您命名的捕获组。

【讨论】:

  • 这是否记录在任何地方?
【解决方案2】:

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

(?<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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多