Проверка или проверка персидской (фарси) строки swift

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

"چهار راه"

"خیابان."

И это не:

"خیابان 5"

"چرا копировать کردی؟"

Кроме того, разрешены только персидские или арабские цифры. Есть исключения для символов [.,-!] (поскольку клавиатуры не поддерживают эти символы в персидском языке)

ОБНОВЛЕНИЕ: в своем ответе я объяснил быструю версию использования регулярных выражений и предикатов.


person iman kazemayni    schedule 07.12.2018    source источник
comment
Вы должны использовать диапазон значений Юникода в диапазоне u0600 u06FF   -  person ares777    schedule 07.12.2018
comment
Я не знаю, какие языки вы используете, но я вижу здесь несколько хороших работ github.com/anetwork/validation/blob/master/src/ с проверкой. Я постараюсь проверить, работает ли регулярное выражение в быстром режиме.   -  person ares777    schedule 07.12.2018
comment
Базовая проверка работает с ([\u{600}-\u{6FF}\u{064b}\u{064d}\u{064c}\u{064e}\u{064f}\u{0650}\u{ 0651}]) ... теперь вы должны правильно определить свое регулярное выражение, чтобы исключить все наборы, которые не входят в диапазон.   -  person ares777    schedule 07.12.2018
comment
Возможный дубликат regex для приема только персидских символов   -  person revo    schedule 16.12.2018
comment
@revo: Как видите, мой вопрос и мой ответ касаются Swift. многие программисты, такие как я, ищут быстрое решение. однако использование регулярных выражений распространено между языками.   -  person iman kazemayni    schedule 16.12.2018
comment
и вам нужно знать, как их сопоставить, это работа для регулярных выражений, и то же самое регулярное выражение из приведенного выше ответа работает быстро.   -  person revo    schedule 16.12.2018


Ответы (2)


На основе этого расширения, найденного в другом месте:

       extension String {
           func matches(_ regex: String) -> Bool {
           return self.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil
           }
        }

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

    let mystra = "چهار راه"
    let mystrb = "خیابان."
    let mystrc = "خیابان 5"
    let mystrd = "چرا copy کردی؟"      //and so on
    for a in mystra {
        if String(a).matches("[\u{600}-\u{6FF}\u{064b}\u{064d}\u{064c}\u{064e}\u{064f}\u{0650}\u{0651}\u{0020}]") {  // add unicode for dot, comma, and other needed puctuation marks, for now I added space etc

    } else {         // not in range
        print("oh no--\(a)---zzzz")
        break        // or return false 
        }
    }

Убедитесь, что вы создаете необходимый Unicode, используя приведенную выше модель. Результат для других строк для a в mystrb ... и т.д. о нет--.---zzzz о нет--5---zzzz о нет--c---zzzz

Наслаждаться

person ares777    schedule 07.12.2018
comment
да, ваше решение решает мою проблему. но я думаю, что это не лучший способ. например, использование полного регулярного выражения может быть лучше - person iman kazemayni; 07.12.2018

Через некоторое время я мог найти лучший способ:

extension String {
 var isPersian: Bool {
        let predicate = NSPredicate(format: "SELF MATCHES %@",
                                    "([-.]*\\s*[-.]*\\p{Arabic}*[-.]*\\s*)*[-.]*")
        return predicate.evaluate(with: self)
    }

}

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

print("yourString".isPersian) //response: true or false

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

https://nshipster.com/nspredicate/

https://nspredicate.xyz/

http://userguide.icu-project.org/strings/regexp

Не стесняйтесь и задавайте любые вопросы по этой теме :D

[EDIT] Следующее регулярное выражение может использоваться для принятия латинских цифр, поскольку они в основном принимаются в персидских текстах.

"([-.]*\\s*[-.]*\\p{Arabic}*[0-9]*[-.]*\\s*)*[-.]*"
person iman kazemayni    schedule 16.12.2018
comment
Это будет принимать символы синдхи, такие как ٻ и ٿ, как персидские, а также арабские ٤. Вы имеете в виду это? Упомянутый ответ С#, кажется, имеет гораздо более точное регулярное выражение. - person Rob Napier; 16.12.2018
comment
\p{Arabic} включает ~1000 символов (некоторые из них ٭ ٪ ؉ ؊ ؈ ؎ ؏ ۞ ۩). Вы уверены, что вам это нужно? - person revo; 16.12.2018