想知道你是否能帮我解决这个问题。
我试图在模式后匹配单词。在这种情况下,我希望在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在这里失败?
由于
答案 0 :(得分:3)
(?=r\/.*?(\w+))
模式是一个积极的先行,它测试一个字符串中的每个位置,并在该位置跟随r/
时返回一个匹配,除了换行符之外的任何0 +字符尽可能少然后将1 +个单词字符捕获到组1中。如果访问组1,您实际上可以获取该值,但如果只是将模式更改为
"(?<=\\br/)\\w+"
该模式将检查r/
(作为整个单词),并且只返回位于此char序列右侧的1个单词字符。
模式详情
(?<=\br/)
- positive lookbehind,需要存在
\b
- word boundary,后跟r/
- r/
字符序列
......紧靠当前位置的左侧\w+
- 一个或多个单词字符(字母,数字或_
字符)。