Regex жадный вопрос - PullRequest
       4

Regex жадный вопрос

3 голосов
/ 17 октября 2008

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

С учетом текста:

test=this=that=more text follows

Я хочу просто выбрать:

test=

Я пробовал следующее регулярное выражение

(\S+)=(\S.*)
(\S+)?=
[^=]{1}
...

Спасибо всем.

Ответы [ 6 ]

11 голосов
/ 17 октября 2008

здесь:

// matches "test=, test"
(\S+?)=

or

// matches "test=, test" too
(\S[^=]+)=

вам следует рассмотреть возможность использования второй версии поверх первой. учитывая вашу строку "test=this=that=more text follows", версия 1 будет соответствовать test=this=that=, затем продолжите анализ до конца строки. затем он вернется назад и найдет test=this=, продолжит возвращаться и найдет test=, продолжит возвращаться и установит test= в качестве окончательного ответа.

версия 2 будет соответствовать test=, затем остановится. Вы можете увидеть выигрыш в эффективности при более крупных поисках, таких как многострочные или целые совпадения документов.

4 голосов
/ 17 октября 2008

Вы, вероятно, хотите что-то вроде

^ (\ S +? =)

Знак ^ привязывает регулярное выражение к началу строки. ? после + делает + не жадным.

3 голосов
/ 17 октября 2008

Возможно, вы ищете ленивые квантификаторы * ?, + ?, ?? и {n, n}?

1 голос
/ 17 октября 2008

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

Подумайте, что вы действительно хотите, это "группа неравных, равных и еще несколько неравных".

([^=]+)=([^=]+)

Ваши примеры [^=]{1} соответствуют только одному не равному символу.

1 голос
/ 17 октября 2008

Вы должны быть в состоянии использовать это:

(\S+?)=(\S.*)
0 голосов
/ 11 апреля 2009

если вы хотите только "text =", я думаю, что просто:

^(\w+=)

должно быть хорошо, если вы уверены, что строка "text =" всегда будет начинать строку.

настоящая проблема в том, что строка выглядит так:

это = это = больше теста = текст следует

если вы используете регулярное выражение выше, результатом будет "this =", и если вы измените вышеупомянутое с квалификаторами reapeater в конце, как это:

^(\w+=)*

вы найдете огромное "это = это =", поэтому я мог только представить себе тривиальное:

[th\w+=]*test=

Bye.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...