Регулярное выражение, чтобы найти и удалить дублирующиеся слова

Храните бизнес-логику вне БД. Или, как минимум, держите это очень худой. Позвольте БД делать то, что она должна делать. Позвольте коду делать то, для чего предназначен код. Период.

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

Если вы работаете с администраторами баз данных, но выполняете свою собственную работу с базой данных, сохраняйте четко определенные разделы между вашими бизнес-объектами, шлюзом между ними и БД и самой БД.

Если вы работаете с администраторами баз данных и вам не разрешено выполнять работу с базами данных (либо политикой, либо потому, что они являются премадоннами), вы очень близки к тому, чтобы быть дураком, полагаясь на них, чтобы добиться чего-либо, поставив зависящая от кода бизнес-логика в ваших объектах БД (sprocs, функции и т. д.).

Если вы - администратор баз данных, разработчики должны поддерживать чистоту своих баз данных. постное.

7
задан triniMahn 30 September 2009 в 17:50
поделиться

9 ответов

Как говорили другие, вам нужно больше, чем регулярное выражение, чтобы отслеживать слова:

var words = new HashSet<string>();
string text = "I like the environment. The environment is good.";
text = Regex.Replace(text, "\\w+", m =>
                     words.Add(m.Value.ToUpperInvariant())
                         ? m.Value
                         : String.Empty);
14
ответ дан 6 December 2019 в 06:03
поделиться

Что ж, Джефф показал мне, как использовать магию обратных ссылок в выражениях и глобального модификатора, чтобы это произошло, поэтому мой исходный ответ не работает. Вы все должны проголосовать за ответ Джеффа. Однако для потомков я отмечу, что в этом есть небольшая хитрая проблема с чувствительностью механизма регулярных выражений, и если вы использовали регулярное выражение со вкусом Perl, вам нужно было бы сделать это:

\b(\S+)\b(?=.*\b\1\b.*)

вместо ответа Джеффа, потому что C # '

4
ответ дан 6 December 2019 в 06:03
поделиться

Обратите внимание на обратные ссылки:
http://msdn.microsoft.com/en-us/library/thwdfzxy (VS.71) .aspx

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

new Regex( @"(.*)\b(\w+)\b(.*)(\2)(.*)", RegexOptions.IgnoreCase );

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

2
ответ дан 6 December 2019 в 06:03
поделиться

Регулярные выражения были бы плохим выбором «инструментов» для решения этой проблемы. Возможно, следующее могло бы сработать:

HashSet<string> corpus = new HashSet<string>();
char[] split = new char[] { ' ', '\t', '\r', '\n', '.', ';', ',', ':', ... };

foreach (string line in inputLines)
{
    string[] parts = line.Split(split, StringSplitOptions.RemoveEmptyEntries);
    foreach (string part in parts)
    {
        corpus.Add(part.ToUpperInvariant());
    }
}

// 'corpus' now contains all of the unique tokens

РЕДАКТИРОВАТЬ: Это я делаю большое предположение, что вы «лексируете» своего рода анализ, например поиск.

1
ответ дан 6 December 2019 в 06:03
поделиться

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

0
ответ дан 6 December 2019 в 06:03
поделиться

Как отмечали другие, это можно сделать с помощью обратных ссылок. См. http://msdn.microsoft.com/nb-no/library/thwdfzxy (en-us) .aspx для получения подробной информации о том, как использовать обратные ссылки в .Net.

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

(\b\w+(?:\s+\w+)*)\s+\1

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

-2
ответ дан 6 December 2019 в 06:03
поделиться

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

К счастью, написать синтаксический анализатор достаточно просто. Взгляните на код Пера Эрика Стендаля.

-1
ответ дан 6 December 2019 в 06:03
поделиться

Мне кажется, это работает

(\b\S+\b)(?=.*\1)

Соответствует так

apple apple orange  
orange red blue green orange green blue  
pirates ninjas cowboys ninjas pirates  
12
ответ дан 6 December 2019 в 06:03
поделиться

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

См. Когда не использовать Regex в C # (или Java, C ++ и т. Д.)

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

0
ответ дан 6 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: