【问题标题】:How get range from regex matches如何从正则表达式匹配中获取范围
【发布时间】:2018-10-05 18:33:44
【问题描述】:

我正在寻找一种从正则表达式匹配中获取范围的方法。我有一个字符串

我正在寻找@{1 |汤姆·洛夫} 和@{2 |水晶黎明}

从这个字符串中,我需要使用以下正则表达式获取这些匹配的范围

"@\\{(\\d+) ?\\| ?(\\w+ *?\\w*?)\\}"

最好的方法是什么?到目前为止,我只能获得比赛,但不能获得范围。显然,标准的Swift函数range(of: <#T##StringProtocol#>, options: <#T##String.CompareOptions#>, range: <#T##Range<String.Index>?#>, locale: <#T##Locale?#>)应该可以做到这一点,但是我不知道如何使用它,似乎找不到一个很好的例子。

我也尝试过这个问题的答案get all ranges of a substring in a string in swift,但我还是无法让它工作。

【问题讨论】:

标签: swift regex range


【解决方案1】:

这适用于 Xcode Playground,但如果它不适合您,请告诉我。

let regex = try! NSRegularExpression(pattern: "@\\{(\\d+) ?\\| ?(\\w+ *?\\w*?)\\}", options: [])

let input = "I'm looking for @{1 | Tom Lofe} and @{2 | Cristal Dawn}"
let range = NSRange(location: 0, length: input.utf16.count)

for match in regex.matches(in: input, options: [], range: range) {
    print(match.range)
}

打印:

{16, 15}
{36, 19}

【讨论】:

  • let input = "?I'm looking for @{1 | Tom Lofe} and @{2 | Cristal Dawn}"试试这个
  • 我不确定我是否理解,@MartinR 现在这是一个不同的问题吗?
  • @ScottMcKenzie 您使用了错误的长度值。您需要通过 utf16 计数。 NSRange(location: 0, length: input.utf16.count)
  • 你试过了吗?您是否注意到只打印了一个范围? – 你会在stackoverflow.com/a/27880748/1187415中找到解释
  • @ScottMcKenzie 好吧,我正在向您展示您的代码有什么问题。如果您愿意,请随时保留您的答案。顺便说一句,options: [] 是默认值,因此您可以省略它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
相关资源
最近更新 更多