Swift 仅当组序列后面不跟?

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,

使用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,
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
    ,以将年份限制在20世纪80年代和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)
    }
}
在控制台中打印:



请记住,这仍然与1990年代、1999a、19999999等情况相匹配,因为您只要求后面不跟p。

假设Swift regex支持,那么您在结尾的负面展望看起来是正确的。您当前的模式有什么问题?可能重复的模式不会返回任何内容。这是关于正则表达式还是swift?根据具体情况,您能否用一些样本数据(以及相关代码)和给定结果与预期结果来澄清您的问题此匹配
1975
2020
2999
。。。和
1,80
,因为
[0,9]
1980
1995
2000
2010
2015
2019