使用Swift 4.2,尝试匹配类似于1980/1989/2019等的正则表达式,但是我需要的是仅当sequence后面不跟“ p”时才匹配吗?我正在尝试的内容...“(?:[1-2] {1} [0,9] {1} [0-9] {1,2})\ 1(?![p])” < / p>
答案 0 :(得分:0)
经过大量测试,我找到了解决方案...“(?:([1-2] {1} [0,9] {1} [0-9] {2})(?![p] ))“
答案 1 :(得分:0)
让我们考虑一下这个字符串:
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}
与列表89
中的单个字符匹配,以将年份限制为1980年代和90年代,[0-9]{1}
一位数字(?![p])
否定的超前查询,表示:后面没有p
,|
逻辑或,20
从字面上匹配字符20
,[01]{1}
与列表01
中的单个字符匹配,以将年份限制为2000年代和2010年代。[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)
}
}
在控制台中打印哪个:
1980 1995 2000 2010 2015 2019
请记住,这仍然会与1990年代,1999a,19999999等内容匹配,因为您只要求不要跟在p后面。