шаблон регулярного выражения для соответствия строке в Objective C

Вот шаблон регулярного выражения, который я создал в Objective C:

^\n?([#]{1,2}$|[*]{1,2}$|[0-9]{1,3}.$)

Я хочу соответствовать:

  1. начинается с \n или пусто
  2. заканчивается # или * или .
  3. если заканчивается . между ними будет 1 или 2 или 3 цифры
  4. Если заканчивается на # или *, между ними может быть еще 1 # или *

Созданное мной регулярное выражение соответствует '\n1#', а это не то, что мне нужно. Может ли кто-нибудь помочь мне исправить это? Это самый быстрый? Регулярное выражение будет использоваться часто, поэтому я хочу, чтобы оно было как можно быстрее.

ОБНОВИТЬ:

Вот пример строк для тестирования:

"\n#", "11*1", "1#", "a1.", "111*", "\n1#", "\n11.", "a11.", "1. ", "*1."

1# и 111* совпали. Не уверен, что пошло не так.


person Jensen    schedule 27.01.2013    source источник
comment
Разве пункт № 1, начинающийся с \n или пустой, бесполезен? Строка, начинающаяся с \n, представляет собой не что иное, как пустую строку. Вместо этого просто найдите строку, которую вы ищете, с явным знаком «^» в начале вашего регулярного выражения. это немного упростит регулярное выражение.   -  person Anil Natha    schedule 28.01.2013
comment
@SlyRaskal имеет смысл, спасибо. Вы знаете, в чем проблема с остальными?   -  person Jensen    schedule 28.01.2013
comment
Изучая это сейчас, не знаю, сработает ли то, что я придумал.   -  person Anil Natha    schedule 28.01.2013
comment
Не могли бы вы опубликовать несколько примеров строк для тестирования?   -  person Anil Natha    schedule 28.01.2013
comment
Я думаю, вам нужно уточнить, какой тип символов должен присутствовать, когда # или * в конце. Я думаю, это проблема. В том, что не должно быть никаких цифр, но может быть любой другой символ, если он заканчивается на # или *?   -  person Anil Natha    schedule 28.01.2013


Ответы (1)


Вы сопоставляете #1 и 111# из-за [0-9]{1,3}.. Вы не избежали ., и эта группа в основном соответствует любой последовательности от 1 до 3 цифр, за которой следует любой символ.

То, что вы ищете, это

^\n?(#{1,2}|\*{1,2}|[0-9]{1,3}\.)$

Правильно экранированный в ObjC, это было бы

@"^\n?(#{1,2}|\\*{1,2}|[0-9]{1,3}\\.)$"

Если это регулярное выражение используется довольно часто, вы можете кэшировать объект NSRegularExpression, чтобы избежать его компиляции каждый раз.

Regexpal очень полезен для тестирования регулярных выражений.

person Jilouc    schedule 27.01.2013
comment
Я как раз собирался сам ответить на вопрос. Я получил предупреждение, когда добавил один файл \. Objective-C требует, чтобы вы добавили два файла \. Спасибо. - person Jensen; 28.01.2013