正则表达式没有正确匹配字符串

时间:2018-02-09 11:57:27

标签: regex swift

想知道你是否能帮我解决这个问题。

我试图在模式后匹配单词。在这种情况下,我希望在r/之后立即匹配单词。

示例:

"这是/ r / stackoverflow"的/ r /示例将匹配"示例"和" stackoverflow"。

我正在使用https://regex101.com/对其进行测试,其中模式(?=r\/.*?(\w+))效果很好。

然而,在Swift中它失败了,返回一个空字符串数组,其长度等于给定字符串中r /的出现次数。

实施如下:

func matches(for regex: String, in text: String) -> [String] {
    do {
        let regex = try NSRegularExpression(pattern: regex, options: [])
        let nsString = NSString(string: text)
        let results = regex.matches(in: text, options: [], range: NSRange(location: 0, length: nsString.length))
        return results.map { nsString.substring(with: $0.range) }
    } catch let error {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}

print(matches(for: "(?=r\\/.*?(\\w+))", in: "This is an /r/example for /r/stackoverflow"))

以上代码打印["", ""]

为什么Swift在这里失败?

由于

1 个答案:

答案 0 :(得分:3)

(?=r\/.*?(\w+))模式是一个积极的先行,它测试一个字符串中的每个位置,并在该位置跟随r/时返回一个匹配,除了换行符之外的任何0 +字符尽可能少然后将1 +个单词字符捕获到组1中。如果访问组1,您实际上可以获取该值,但如果只是将模式更改为

,您仍可以继续使用代码
"(?<=\\br/)\\w+"

该模式将检查r/(作为整个单词),并且只返回位于此char序列右侧的1个单词字符。

请参阅online regex demo

模式详情

  • (?<=\br/) - positive lookbehind,需要存在
    • \b - word boundary,后跟
    • r/ - r/字符序列 ......紧靠当前位置的左侧
  • \w+ - 一个或多个单词字符(字母,数字或_字符)。