Regex, только если за последовательностью группы не следует? - PullRequest
0 голосов
/ 25 апреля 2019

Используя Swift 4.2, пытаясь сопоставить регулярное выражение, аналогичное 1980/1989/2019 и т. Д., Но что мне нужно, это совпадение, только если за последовательностью не следует "p"?что я пытаюсь ... "(?: [1-2] {1} [0,9] {1} [0-9] {1,2}) \ 1 (?! [p])"

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Давайте рассмотрим эту строку:

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.

0 голосов
/ 25 апреля 2019

После большого количества испытаний я нашел решение ... "(?: ([1-2] {1} [0,9] {1} [0-9] {2}) (?! [P] )) "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...