2013-08-04 4 views
3

Я пытаюсь найти кратчайшую последовательность символов между словами «I» и «не согласен» (не чувствителен к регистру). Я прочитал все похожие вопросы о SO, но ни одно из решений, похоже, не работает для меня. Вот пример предложение, которое вызывает у меня горе:Как извлечь наименьшее количество символов между двумя словами?

As an American, I must disagree with you.

А вот моя догадка, как на регулярных выражений шаблона:

I(.*?)disagree

Я хочу, чтобы захватить только «должен», но вместо этого я захватываю более длинную строку, «может, я должен». Я надеюсь не указывать, что за «Я» должно следовать что-то другое, как пробел. Потому что, тогда я бы ничего не зафиксировал в таком предложении, как «Я не соглашусь с этим». Я также не хочу настаивать на том, чтобы «я» был капитализирован. В принципе, я просто хочу, чтобы наименее жадный матч был возможен. Этот сайт является одним из тех мест, которые я использую для проверки. Решение:

http://regexpal.com/?flags=gi & регулярок = I% 28 *% 3F% 29% 20disagree & вход = As % 20an% 20American% 2C% 20I% 20must% 20disagree% 20with% 20you.

+0

Используйте '\ b' требовать * слово * граничное вокруг захваченной части. Затем собрать все матчи и выбрать самый короткий? – DCoder

+0

Это реальный прецедент? – Gumbo

+1

Если вход «Я не согласен», вы хотите '' kinda "' или '' nda "'? – user2357112

ответ

1

Общий подход заключается в использовании negative lookahead:

(I)(((?!\1).)*?) disagree 

См demo здесь.

Обратите внимание, что группа для слова между ними составляет $2. Если вы не хотите этого, вы можете повторить 1-е слово:

I((?:(?!I).)*?) disagree 

Но я бы сказал, что первая версия легче поддерживать, особенно если это слово bigger.

+0

Все эти ответы очень полезны. Однако этот подход с отрицательным взглядом является более точно тем, что я пытался выполнить с помощью шаблона regex. – user2649854

1

границы Используйте слово (\b):

/\bi(.*?)\bdisagree/i 
  • нечувствителен к регистру
  • матчи I, но не I'll ('ll будет частью захваченное)
+0

положил '\ b' за I, или он будет соответствовать любому слову, начинающемуся с символа I.' \ bI \ b' будет соответствовать как 'I' в' I', так и 'I'll'. – Sumurai8

+0

Границы слов будут работать только, если, конечно, шаблоны между ними должны быть только полными словами. Если нет, границы слов [не будут достаточно общими] (http://goo.gl/u0C6qx). – acdcjunior

+0

И true, иначе '\ s' нужно будет использовать с положительными/отрицательными lookbehinds – vol7ron

1

вам нужно для использования lookaround для regex, используйте это регулярное выражение (?<=[iI])(\W.*)(?=disagree), и вы получите o а слово между мной и не соглашаться.

Example here

+0

JavaScript не поддерживает утверждения look-behind. – Gumbo

+0

, но я пробую это в JEdit, и это работа. Я думаю, что они были исправлены в JDK 1.6? – Angga

+0

[JavaScript не является Java.] (Http://www.crockford.com/javascript/javascript.html) – Gumbo

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

  • Нет связанных вопросов^_^