2014-11-14 7 views
1

Я написал небольшую программу, чтобы найти строку в строке, которая работает до сих пор. Но у меня проблема с NSRegularExpression - мне нужен правильный шаблон для моего особого случая и застрял.NSRegularExpression - проблема с шаблоном

NSString *strRegExp = [NSString stringWithFormat:@"?trunk/%@/%@/+\\([a-zA-Z0-9_\\-\\.])+/Host-1", inputstrse , inputstrsno]; 

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:strRegExp options:  NSRegularExpressionCaseInsensitive error:NULL]; 

NSArray *arrayOfAllMatches = [regex matchesInString:inputurl options:0 range:NSMakeRange(0, [inputurl length])]; 

Шаблон NSRegularExpression должен соответствовать струне выглядеть следующим образом:

trunk/%@/%@/some-text-1/Host-1 
trunk/test/1/5-text-text/Host-1 

Где багажник /% @ /% @/и/хост-1 всегда остается тем же самым. Только часть в середине является переменной и всегда выглядит следующим образом:

NUMBER-Some-Text -> 5-Hello-World -> /trunk/test/1/5-hello-world/Host-1 

Я пробовал с разным RegExp, как вы видите здесь: «Ствол /% @ /% @/+ \ ([a- zA-Z0-9 _ \ - \.]) +/Host-1 ", но я все еще не работаю, может быть, кто-то может мне помочь.

Может быть, есть Probleme, когда я строить модели с:

NSString *strRegExp = [NSString stringWithFormat:@"?trunk/%@/%@/+\\([a-zA-Z0-9_\\-\\.])+/Host-1", inputstrse , inputstrsno]; 

И использовать его позже как то:

regularExpressionWithPattern:strRegExp 

Я надеюсь, что кто-то может помочь мне - я новичок в RegularExpressions ,

+0

Как выглядит ваш ввод? – Rick

+0

inputse - это что-то вроде: Hello-Test-1 или Hallo или Hallo-1 inputno - это всего лишь число от 1 до 30 inputurl - это простой HTML-код с веб-сайта. – MillerPI

+0

Итак, у вас есть куча текста и вы хотите выделить части, которые выглядят как '/ trunk/test/1/5-hello-world/Host-1'? – Rick

ответ

1

Как правило, выражение Regex как «Я хочу совместить несколько букв, затем тире, затем число» и т. Д., Это самый простой способ его создания. Кроме того, использование инструмента, такого как http://www.regexr.com, упрощает многое.

Из того, что я понимаю, вы хотите, чтобы соответствовать следующим образом:

trunk/test/1/[some number]-[some text]-[some other text]/Host-1 

Если это так, то следующее регулярное выражение должно резать:

trunk\/test\/1\/[0-9]*-[a-zA-Z]*-[a-zA-Z]*\/Host-1 

Он делает следующее:

  1. trunk\/test\/1\/: Сопоставьте постоянную строку trunk/test/1/ (обратная косая черта - побеги)
  2. [0-9]*-: Матч любого количества цифр, за которыми следует -
  3. [a-zA-Z]*-: Матч любого количества букв, за которыми следует -
  4. [a-zA-Z]*: Матч любого количества букв
  5. \/Host-1: Матч постоянной строки /Host-1/

Вот ссылка на RegExr, которую вы можете использовать, если хотите поэкспериментировать с различными входными данными или изменениями в регулярном выражении: http://regexr.com/39tgn

В комментариях указана следующая строка: trunk\test\/1\/.*\/Host-1. Это немного менее строго, но и эта работа.

+0

Большое спасибо - Понял! :) – MillerPI

+0

Просто одно последнее: он работает, но есть одна проблема: trunk/test/1/[some number] - [некоторый текст] - [какой-то другой текст]/Host-1 отлично работает с trunk \/test \/1 \/[0-9] * - [a-zA-Z] * - [a-zA-Z] * \/Host-1, но в некоторых случаях существует более двух [некоторых текстовых] областей, таких как: trunk/test/1/[some number] - [некоторый текст] - [какой-то другой текст] - [какой-то другой текст]/Host-1 он находится в пределах от 1 [некоторого текста] до 10 - что я могу сделать, чтобы соответствовать всем случаях с одним RegExp? – MillerPI

+0

Получил его работу с "trunk \ /% @ \ /% @ \ /.* \/Host-1". Благодаря! – MillerPI

-1

Я не знаю Objective-C, но ваше регулярное выражение имеет кучу странностей, если я удалю те, у кого есть то, что, я думаю, вы хотите достичь.

Ваш первый символ - ?, которого не может быть, это квантификатор в регулярном выражении, который говорит что-то о предыдущем символе (или классе или группе). Если это первый символ, предшествующего символа нет.

/+\\ < - не зная, что вы пытаетесь сделать здесь, но это означает «1 или более / с последующим \»

[a-zA-Z0-9_\\-\\.] можно сделать гораздо короче, как: [\w.-], и если вы поместите + в скобках будет захватить всю неизвестную строку в группе захвата 1.

Из комментариев: Так %@ переменная текст, первый во все дни s только буквы, 2-й всегда просто цифры. Это будет [a-zA-Z]+ и \d+ соответственно в регулярном выражении. Но на самом деле я бы использовал [^/]+ (любой символ, который не является /), так что код не прерывается, когда кто-то помещает другой символ в этот путь, например trunk/this_text/4/.../Host-1, который разбился бы на _.

Комбинированное это делает (изменено после комментариев):

trunk/[^/]+/[^/]+/([\w.-]+)/Host-1 

Regular expression visualization

Debuggex Demo

Теперь обратите внимание, что это не побег, чтобы получить правильную строку в regex, но если Objective-C - что-то вроде C#, тогда strin g, начинающийся с @"...", не требует экранирования.

+0

Большое спасибо за этот отличный ответ !!! trunk/test/1/5-text-text/Host-1 - это текст, который _should_ соответствует. Это всегда одно и то же: statictext/varitext/varinumber/RandomTextNumbersAnd-/statictext. – MillerPI

+0

@MillerPI Изменен ответ соответственно :) – funkwurm

+0

Все еще не работает - чтобы сделать его более четким, строка содержит только одну неизвестную часть./ KnownTextStatic/KnownTextThatcomesFromVariable/KnownNumberThatComesFromVariable/UnknownPart/KnownTextStatic, где UnkownPart - это строка, которая содержит цифры от 1 до 30, нижние и верхние регистры и минусы («-»). Поэтому мне нужен шаблон, который соответствует sometext/UNKNOWN/sometext, как описано выше. Надеюсь, теперь это ясно. – MillerPI