2009-07-09 6 views
0

Я смотрю на регулярное выражение в нашем исходном коде, и я не уверен, что это правильно.Что означает это регулярное выражение?

<<SWE.[^<<]*>> 

В частности, что делает часть [^<<]? Я думал, что скобки позволили вам поставить диапазон. Не включает в себя "< <" или еще один "<"?

Если это строка текста разбираемый:

<<SWE.SomeText>><<SWE.SomeMoreText>> 

Я думаю, что намерение автора, чтобы иметь два матча, а не один.

match[0] = <<SWE.SomeText>> 
and 
match[1] = <<SWE.SomeMoreText>> 

вместо

match[0] = <<SWE.SomeText>><<SWE.SomeMoreText>> 

Есть ли лучший способ? Как насчет <<SWE.*?>>

ответ

0

RegexBuddy говорит:

Матч любой символ, который не является «<» «[^ < <] *»

между нулем и неограниченное раз, так как многие по возможности, с возвратом при необходимости (жадный) «*»

2

Я думаю, что выражение вы хотите:

<<SWE\.[^>]*>> 

Это будет соответствовать два примера вы дали.

4

Мне кажется, что желаемое за действительное. [^ < <] будет соответствовать любому, кроме <. Неважно < < или < не имеет значения. [^ <] и [^ < <] означает то же самое.

0

[^<<] эквивалентен [^<], листинг символа дважды в классе символов является избыточным. Он также должен быть [^>] с справа угловой кронштейн, я бы подумал. Также точка должна быть экранирована как «\.».

Я согласен с вашим регулярным выражением: <<SWE\..*?>> лучше. Однако, если это имеет значение, нежелательный оператор может привести к непредвиденному возврату в несоответствующей строке, тогда как [^>]* не будет включать никакого возврата и, следовательно, может быть более эффективным.

+0

'[^>] *' все равно может включать обратное отслеживание, если часть, которая приходит после него, не может совпадать. Чтобы действительно убить обратный путь, вы должны сделать его притяжательным, как этот '[^>] * +'. – Geert

0

Вы правы [^<<] исключает только один <; второй < является избыточным.

Это, конечно, кажется, что первоначальное намерение состоит в том, чтобы убедиться, что >> в конце картины не жадный, и лучший способ сделать это состоит в использовании *? вместо *, как в вашей окончательной модели, <<SWE.*?>>.

Следует отметить, что вы хотите, чтобы префикс в тегах был «SWE.», Поэтому вам нужно добавить период с экранированием в шаблон, в дополнение к периоду «любой charater». Таким образом:

<<SWE\..*?>> 
0

Какой вкус регулярного выражения вы используете?

Если вы используете что-то экзотическое, «< <» и «>>» могут стоять за границы слов внутри и снаружи класса символов.

+0

Нет, класс символов всегда соответствует ровно одному символу. Конструкция границы слова является утверждением нулевой ширины - она ​​не потребляет никаких символов. –

0

[^ является отрицательным символьным классом - соответствует вещам, которые НЕ являются этими символами.

Это соответствует первым:
< < SWE. *? > >

Это соответствует одному или более:
(?: < < SWE * > >.?) +

Это соответствует все между < < и последним > > (в том числе более > >-х) :
< < SWE. * > >

Смежные вопросы