2013-05-02 2 views
1

регулярное выражение, чтобы найти слова, которые повторяются в одной строке? Я пробовал некоторые выражения, которые я нашел в StackOverflow как this, но никто не работает правильно.Regex несколько слов в той же строке

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

enter image description here

+6

Некоторые примеры входных и выходных поможет. Что такое «слово»? Что не работает с вашими предыдущими попытками? Какой язык программирования/инструмент/среда (т. Е. Какой аромат регулярного выражения) вы используете? –

+0

Что такое «слово»? Любое слово. Что не работает с вашими предыдущими попытками? У вас есть пример в ссылке на мой вопрос. Какой язык программирования/инструмент/среда (т. Е. Какой аромат регулярного выражения) вы используете? Любой текстовый редактор, то есть Sublimetext, notepad ++, ... – PoseLab

+0

Я не вижу, что не работает в связанном вопросе. «Любое слово» на самом деле не помогает. Только буквы? Или регулярное выражение слова? (буквы, цифры, символы подчеркивания). «Не слово?» Просто потому, что вы связали вопрос, который предоставил примеры ввода/вывода, не делает ваш собственный вопрос более полным. Это действительно помогло бы, если бы у нас был какой-то ваш фактический пример ввода. Также «слова, которые повторяются в одной строке» - должны быть последовательными (как в связанном вопросе)? Или вы хотите найти 'foo' в' foo bar foo'? Для меня это повторяется в той же строке. –

ответ

12

Это регулярное выражение сделает, чтобы найти слова, которые вы хотите выделить. (пример в Javascript, легко тестируемый в консоли Javascript браузера.)

s = "It's a foo and a bar and a bar and a foo too."; 
a = s.match(/\b(\w+)\b(?=.*\b\1\b)/g); 

Это возвращает массив слов, возможно, много раз для одного и того же слова.

Далее вы можете сделать это:

re = new RegExp('\\b(' + a.join('|') + ')\\b', 'g'); 

и что должно быть достаточно, чтобы выделить все вхождения:

out = s.replace(re, function(m) { return '<b>' + m + '</b>' }); 
+0

Это идеальное спасибо мужчине – MSS

-1

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

Строка

Меня зовут Джеймс и Джеймс мое имя

Regex

^(Джеймс) $

Группа 1 (0, как правило, полная строка соответствия и, скорее всего, не будет отсчета) дважды. Это означает, что слово повторяется. В инструменте, который вы используете для выполнения своего регулярного выражения, требуется некоторая логика, чтобы решить, как вас интересует слово.

Используя ту же строку, рассмотрим это регулярное выражение

(?<=James.*)(James) 

Это обнаружит слово Джеймс, только если это исходило от «Джеймс» следует любой символ. В зависимости от вашего двигателя, '.' (период) должен соответствовать любому символу, который равен , а не по умолчанию. Это ограничивает поиск одной строкой.

Обратите внимание на ограничение того, что нужно точно указать слово. Я не уверен, как обойти это.

EDIT Попробуйте, это Doozy ..

(< =^|?. \ S + \ 1 \ S + *) \ s + (\ W +)

Использование положительного просмотра назад (как в примере 2) мы обнаруживаем «целые слова», которые соответствуют нашей текущей группе. Целое слово определяется как:

  • Наше текущее слово
  • протекала по крайней мере 1 символ пробела или в начале строки
  • следуют по крайней мере, 1 пространство

Кроме того, матч, на котором мы находимся, должен быть автономным словом (предшествующим хотя бы одному пробелу).

Что касается результатов, каждое совпадение будет повторяющимся.

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