Регулярное выражение для сопоставления нескольких строк - PullRequest
14 голосов
/ 30 марта 2009

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

\b(good|great)\w*\b

Кто-нибудь может указать мне правильное направление?

Редактировать: Следует отметить, что я не хочу просто сопоставлять целые слова. Например, я могу также подобрать «ood» или «reat» (части слов).

Редактировать 2: Вот пример текста: «Это действительно замечательная история». Я мог бы хотеть соответствовать "этому" или "действительно", или я мог бы хотеть соответствовать "eall" или "reat".

Ответы [ 6 ]

22 голосов
/ 30 марта 2009

Если вы можете гарантировать, что в вашем списке слов нет зарезервированных символов регулярных выражений (или если вы их не используете), вы можете просто использовать этот код для превращения a big word list в @"(a|big|word|list)". Нет ничего плохого в том, что вы используете оператор |, если вы его окружаете. Похоже, шаблоны \w* и \b мешают вашим матчам.

String[] pattern_list = whatever;
String regex = String.Format("({0})", String.Join("|", pattern_list));
4 голосов
/ 30 марта 2009
(good)*(great)*

после вашего редактирования:

\b(g*o*o*d*)*(g*r*e*a*t*)*\b
1 голос
/ 01 апреля 2013

Просто проверьте логическое значение, которое возвращает Regex.IsMatch().

if (Regex.IsMatch(line, "condition") && Regex.IsMatch(line, "conditition2"))

Строка будет иметь оба регулярных выражения, верно.

1 голос
/ 16 января 2012

Я думаю, что вы просите что-то, что вы на самом деле не имеете в виду если вы хотите найти какую-либо часть слова, вы буквально ищете буквы

например. Поиск {Джек, Джим} в "Джон и Шелли круты"

ищет все буквы в именах {J, a, c, k, i, m}

* J * он * a * и Шелли * a * re

и для этого вам не нужен REG-EX:)

по-моему, A Суффикс Дерево может помочь вам в этом

http://en.wikipedia.org/wiki/Suffix_tree#Functionality

наслаждаться.

1 голос
/ 30 марта 2009

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

function wordPermutations( $word, $minLength = 2 )
{
    $perms = array( );

    for ($start = 0; $start < strlen( $word ); $start++)
    {
        for ($end = strlen( $word ); $end > $start; $end--)
        {
            $perm = substr( $word, $start, ($end - $start));

            if (strlen( $perm ) >= $minLength)
            {
                $perms[] = $perm;
            }
        }
    }

    return $perms;
}

Тестовый код:

$perms = wordPermutations( 'great', 3 );  // get all permutations of "great" that are 3 or more chars in length
var_dump( $perms );

echo ( '/\b('.implode( '|', $perms ).')\b/' );

Пример вывода:

array
  0 => string 'great' (length=5)
  1 => string 'grea' (length=4)
  2 => string 'gre' (length=3)
  3 => string 'reat' (length=4)
  4 => string 'rea' (length=3)
  5 => string 'eat' (length=3)

/\b(great|grea|gre|reat|rea|eat)\b/
0 голосов
/ 30 марта 2009

Я не правильно понимаю проблему:

Если вы хотите сопоставить "great" или "reat", вы можете выразить это следующим образом:

"g?reat"

Это просто говорит о том, что часть "reat" должна существовать, а "g" необязательна.

Это будет соответствовать "reat" и "great", но не "eat", потому что требуется первый "r" в "reat".

Если у вас тоже есть слова «отлично» и «хорошо», и вы хотите сопоставить их оба с необязательным «g», вы можете написать это так:

(g?reat|g?ood)

А если вы хотите включить границу слова, например:

\b(g?reat|g?ood)

Вы должны знать, что это не будет совпадать с чем-то вроде «дышать», потому что у вас есть «reat», но «r» не находится на границе слова из-за «b».

Поэтому, если вы хотите сопоставить целые слова, содержащие ссылку на подстроку «reat» или «ood», вам следует попробовать:

"\b\w*?(reat|ood)\w+\b"

Это гласит: 1. Начиная с границы слова, начинайте сопоставлять любое количество слов-символов, но не будьте готовы. 2. Совпадение «reat» или «ood» гарантирует, что сопоставляются только те слова, которые содержат одно из них. 3. Сопоставьте любое количество символов слова после «reat» или «ood», пока не будет достигнута следующая граница слова.

Это будет соответствовать:

"добро", "хорошо", "ood" (если полное слово)

Это можно прочитать как: Дайте мне все полные слова, которые содержат «ood» или «reat».

Это то, что вы ищете?

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