Swift регулярное выражение: соответствует ли строка шаблону?

Статические свойства недоступны в EL. Обходной путь, который я использую, заключается в создании нестатической переменной, которая присваивает статическое значение.

public final static String MANAGER_ROLE = 'manager';
public String manager_role = MANAGER_ROLE;

Я использую lombok для генерации getter и setter, так что это очень хорошо. Ваш EL выглядит так:

${bean.manager_role}

Полный код в http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf -el

29
задан joelparkerhenderson 22 April 2015 в 15:15
поделиться

5 ответов

Решение Swift версии 3:

if string.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil ...

Решение Swift версии 2:

if string.rangeOfString(pattern, options: .RegularExpressionSearch) != nil ...

Пример - содержит ли эта строка две буквы «о»? ]

Примечание. Если появляется сообщение об ошибке 'String' does not have a member 'rangeOfString', добавьте его перед: import Foundation. Это связано с тем, что Foundation предоставляет методы NSString, которые автоматически соединяются с классом Swift String.

import Foundation

Спасибо Онно Эберхарду за обновление Swift 3.

64
ответ дан joelparkerhenderson 22 April 2015 в 15:15
поделиться

В Swift 4.2 следующее не возвращает ноль, даже если строка не соответствует шаблону:

string.range(of: regex, options: .regularExpression, range: nil, locale: nil)

Как предполагает XCode:

Сравнение необязательного значения типа 'NSRange' (он же '_NSRange') с nil всегда возвращает true

Поэтому в итоге я использовал:

if string.range(of: regex, options: .regularExpression)
        .location != NSNotFound {
    // do stuff if string matches regexp
}
-1
ответ дан P J Szekszardi 22 April 2015 в 15:15
поделиться

Упомянутые выше решения больше не работали для меня, поэтому я публикую свое решение здесь (я использовал расширение для String):

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

Пример:

if str.matches("^[a-zA-Z0-9._-]{1,30}$") {
    //...
}
20
ответ дан Onno Eberhard 22 April 2015 в 15:15
поделиться

Чтобы получить синтаксис, о котором вы на самом деле спрашиваете, вы можете легко определить новый оператор, который обернет функциональность NSString моста:

infix operator =~ {}
func =~(string:String, regex:String) -> Bool {
    return string.rangeOfString(regex, options: .RegularExpressionSearch) != nil
}

"abcd" =~ "ab*cd"
"abcd" =~ "abcde+"
12
ответ дан David Berry 22 April 2015 в 15:15
поделиться

Это вернет, соответствует ли строка шаблону

, например. matchPattern (text: "sd56Yz", pattern: "[a-zA-Z0-9] +") true

например. matchPattern (текст: "sd56 $ Yz", шаблон: "[a-zA-Z0-9] +") false

func matchesPattern(text: String?, pattern: String?) -> Bool {
    guard hasValue(text) && hasValue(pattern) else {
        return false
    }

    let range = text!.rangeOfString(pattern!, options: .RegularExpressionSearch)

    guard range != nil else {
        return false
    }

    let rangeString = text?.substringWithRange(range!)

    return areEqual(text, string2: rangeString)
}
-2
ответ дан Gary Davies 22 April 2015 в 15:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: