Как проверить имя (John D'Largy) в iOS Swift4.2? - PullRequest
3 голосов
/ 26 апреля 2019

Я перепробовал все возможности переполнения стека ( link1 , link2 ). Ответы мне бесполезны.

Я использую следующее регулярное выражение для проверки имени,В онлайн-случае ( OnlineRegex ) он работает нормально, но когда я реализовал его на мобильных устройствах, он не работает.

Пожалуйста, помогите мне

func isValidName() -> Bool {
    let RegEx = "^[a-zA-Z]+(([\\'\\,\\.\\-\\ ][a-zA-Z ])?[a-zA-Z]*)*$"
    let Test = NSPredicate(format:"SELF MATCHES %@", RegEx)
    return Test.evaluate(with: self)
}

Я вызываю вышеуказанную функцию как

let str = "John D'Largy"
        if str.isValidName(){
            print("Valid")
        }else{ print("Not valid")}

Выход : «Действительный»

Та же самая функция, которую я вызываю для проверки моего первого текстового поля, я получаю «Неправильно»

if firstNameTxt.text.isValidName(){
            print("Valid")
        }else{ print("Not valid")}

Я ввел тот же текст в мобильном ключевом слове

OutPut : «Неvalid "

Я что-то пропустил?или я должен изменить значение регулярного выражения?Любые предложения.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

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

(?:[a-zA-Z]+(?:['‘’,.\\s-]?[a-zA-Z]+)*)?

Код, который у вас уже есть, требует полного совпадения строк, и вам не нужны явные привязки, такие как ^ / \A и $ / \z.

Кроме того, поскольку одинарные кавычки автоматически преобразуются в фигурные кавычки, вы должны либо добавить их в регулярное выражение, либо отключить поведение .

Одна из самых важных вещей в этом регулярном выражении состоит в том, что он должен иметь возможность сопоставлять частично правильную строку, поэтому все части являются необязательными (то есть они могут соответствовать 0 символам). Он заключен в необязательную группу без захвата ((?:...)?), которая соответствует 1 или 0 вхождениям.

Regex details

  • [a-zA-Z]+ - 1 или более букв
  • (?: - запуск внутренней группы без захвата:
    • ['‘’,.\\s-]? - 1 или 0 пробелов, одинарные кавычки, дефисы
    • [a-zA-Z]+ - 1+ букв
  • )* - 0 или более повторений.

Примечание: чтобы соответствовать любой букве Unbicode, используйте \\p{L} вместо [a-zA-Z].

Graph

enter image description here

1 голос
/ 26 апреля 2019

Видите, я попробовал ваш код на игровой площадке и немного изменил синтаксис, но не логику

enter image description here

Ниже приведен фрагмент кода, попробуйте запустить его на своей игровой площадке

    func isValidName(str: String) -> Bool {
       let RegEx = "^[a-zA-Z]+(([\\'\\,\\.\\-\\ ][a-zA-Z ])?[a-zA-Z]*)*$"
       let Test = NSPredicate(format:"SELF MATCHES %@", RegEx)
       return Test.evaluate(with: str)
    }

    func check(){
       let str = "John D'Largy"

       if isValidName(str: str){
           print("Valid")
       }else{
           print("Not valid")
       }
    }

check()

Надеюсь, это поможет!

...