正则表达式仅在组序列不跟在后面时吗?

时间:2019-04-25 14:11:52

标签: swift

使用Swift 4.2,尝试匹配类似于1980/1989/2019等的正则表达式,但是我需要的是仅当sequence后面不跟“ p”时才匹配吗?我正在尝试的内容...“(?:[1-2] {1} [0,9] {1} [0-9] {1,2})\ 1(?![p])” < / p>

2 个答案:

答案 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后面。