Быстрое регулярное выражение для проверки, соответствует ли строка формату суммы (2x, 3x, …)

#ios #swift #regex #string

#iOS #swift #регулярное выражение #строка

Вопрос:

Я хотел бы проверить, находится ли данное String значение в формате суммы. Несколько примеров для лучшего понимания:

Должен вернуться true :

2x

31x

3x abcd

Должен вернуться false :

2×3

3xabc

asdf3x

Итак, в общем: оно должно начинаться с числа (0-9), может быть больше цифр. Сразу после числа должно следовать «x» / «X», а после «x» / «X» должен быть конец или пробел.

Я изо всех сил пытаюсь это сделать.. Это то, что я пробовал:

 func isAmountFormat() -> Bool {
    return self.matches("[0-9] [X,x]")
}
 

Кто-нибудь может мне здесь помочь?

Комментарии:

1. Вы могли бы добавить границы слов b[0-9] [Xx]b

2. @Thefourthbird это дает invalid escape sequence in literal .

3. Тогда, возможно \b[0-9] [Xx]\b

4. Использование группы захвата \b([0-9] )[Xx]\b см. regex101.com/r/Y2DNT9/1

5. Используйте "(?i)\b[1-9][0-9]*x\b" . Не могли бы вы описать, что вы подразумеваете под «форматом суммы», чтобы получить ответ?

Ответ №1:

Вы можете использовать

 "(?i)\b[1-9][0-9]*x\b"
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • (?i) — флаг без учета регистра (на случай, если вы не можете передать .caseInsensitive в своем текущем методе сопоставления регулярных выражений)
  • b — граница слова
  • [1-9] — ненулевая цифра
  • [0-9]* — любой ноль или более цифр
  • x X или x
  • b — граница слова.

Смотрите Быстрый фрагмент:

 let test = "3x abcd"
if test.range(of: "\b[1-9][0-9]*x\b", options: [.regularExpression, .caseInsensitive]) != nil {
    print("Matched")
} else {
   print("No match")
}
 

Обратите внимание, что если совпадение должно произойти в начале строки, вы можете скомпилировать объект регулярного выражения с .anchored параметром или заменить первый \b на ^ .