iOS создает регулярное выражение для использования с NSRegularExpression

я пытался читать документацию Apple, но я никогда не буду использовать регулярное выражение, и я не понимаю, как решить этот вопрос. Мне нужно написать регулярное выражение для проверки, выбрал ли пользователь строку, которая соответствует этим правилам: первая буква может быть s или S, а необязательные вторые символы могут быть . (символьная точка) и необязательная 4-значная цифра может быть от 1 до 4 и должна всегда присутствовать после того, как число может присутствовать любой одиночный символ от az и может быть необязательным после того, как я могу иметь . (символьная точка) и это необязательно, последние 2 должны быть цифрой, всегда должны быть 2 числа и могут быть необязательными

я пробовал так писать

NSString *regexStr = @"(s|S)?(\\.)?(\\d+){,4}([a-z]?(\\.)?(\\d+){2}?";

но консоль выдает эту ошибку

Error making regex: Error Domain=NSCocoaErrorDomain Code=2048 
"The operation couldn’t be completed. (Cocoa error 2048.)" UserInfo=0x6d3e9b0  
{NSInvalidValue=(s|S)?(\.)?(\d+){,4}([a-z]?(\.)?(\d+){2}?}

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


person Hw.Master    schedule 06.06.2012    source источник


Ответы (1)


Ну вот:

(s|S)?(\.)?(\d){0,4}[a-z]?(\.)?(\d){2}?

У вас была лишняя открывающая скобка, которая делала синтаксис недействительным, и знаки + после \d, которые заставляли регулярное выражение принимать бесконечное количество цифр.

Regexpal отлично подходит для отладки регулярных выражений: http://regexpal.com/

person geon    schedule 06.06.2012
comment
Спасибо geon за помощь и за хорошие предложения по ссылке. - person Hw.Master; 06.06.2012
comment
Я пробовал и работает таким образом NSString* regexStr = @(s|S)?(\.)?(\\d){2,4}[az]?[az]?(\.)?; проблема в последней части выражения, в последних 2 необязательных цифрах. Если я изменил таким образом NSString* regexStr = @(s|S)?(\.)?(\\d){2,4}[az]?[az]?(\.)?(\\d) {2}?; с кодом, подобным этому, s.10 не соответствует результату, в то время как с s.1000 количество совпадений равно 1. Кажется, что последний вариант добавляет к маске еще 2 цифры, но мне нужно изменить таким образом: проверить последние 2 номер, только если присутствует последний символ точки. Является ли это возможным? Спасибо - person Hw.Master; 06.06.2012
comment
О, вам все еще нужно экранировать обратную косую черту при вводе в виде строки: @(s|S)?(\\.)?(\\d){0,4}[az]?(\\.)? (\\г){2}?. - person geon; 06.06.2012
comment
Спасибо, геон работает! Точный для моего случая, если кому-то нужен в качестве примера, это (s|S)?(\\.)?(\\d){2,4}[az]?(\\.)?(\\d){ 2}? - person Hw.Master; 06.06.2012