Swift 仅当组序列后面不跟?
使用Swift 4.2,尝试匹配类似于1980/1989/2019等的正则表达式,但我需要的是仅当序列后面没有“p”时才匹配?我正在尝试的是。。。“(?:[1-2]{1}[0,9]{1}[0-9]{1,2})\1(?![p])”经过大量测试,我找到了一个解决方案。。。“(?):([1-2] { 1 } [0,9] { 1 } [09] { 2 }(?![P])”让我们考虑这个字符串:Swift 仅当组序列后面不跟?,swift,Swift,使用Swift 4.2,尝试匹配类似于1980/1989/2019等的正则表达式,但我需要的是仅当序列后面没有“p”时才匹配?我正在尝试的是。。。“(?:[1-2]{1}[0,9]{1}[0-9]{1,2})\1(?![p])”经过大量测试,我找到了一个解决方案。。。“(?):([1-2] { 1 } [0,9] { 1 } [09] { 2 }(?![P])”让我们考虑这个字符串: let str = """ 10 Hello 980 world, 1975 Hello 1980 world,
let str = """
10 Hello 980 world,
1975 Hello 1980 world,
1985p Hello :1995 world,
2000 Hello 2005p world,
2010 Hello 2015 world,
2019 Hello 2020 world,
2999
"""
让我们声明这个正则表达式:
let pattern = "19[89]{1}[0-9]{1}(?![p])|20[01]{1}[0-9]{1}(?![p])"
let regex = try! NSRegularExpression(pattern: pattern)
以下是模式的不同部分:
逐字匹配字符19
19
匹配列表中的单个字符[89]{1}
,以将年份限制在20世纪80年代和90年代89
年度的一位数字[0-9]{1}
负前瞻,意思是:后面不跟(?![p])
p
逻辑或|
逐字匹配字符20
20
匹配列表中的单个字符[01]{1}
,将年份限制为2000年代和2010年代01
年度的一位数字[0-9]{1}
负前瞻,意思是:后面不跟(?![p])
p
let matches =
regex.matches(in : str,
range : NSRange(location: 0, length: str.utf16.count))
for match in matches {
let range = match.range
if let swiftRange = Range(range, in: str) {
let name = str[swiftRange]
print(name)
}
}
在控制台中打印:
请记住,这仍然与1990年代、1999a、19999999等情况相匹配,因为您只要求后面不跟p。假设Swift regex支持,那么您在结尾的负面展望看起来是正确的。您当前的模式有什么问题?可能重复的模式不会返回任何内容。这是关于正则表达式还是swift?根据具体情况,您能否用一些样本数据(以及相关代码)和给定结果与预期结果来澄清您的问题此匹配
1975
,2020
2999
。。。和1,80
,因为[0,9]
1980
1995
2000
2010
2015
2019