#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/15. Используйте
"(?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
на ^
.