Подтвердить что ты не робот

Regex для соответствия нескольким строкам

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

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

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

Изменить: Я должен отметить, что я не хочу просто сопоставлять целые слова. Например, я могу захотеть совместить "ood" или "reat" (части слов).

Изменить 2: Вот пример текста: "Это действительно отличная история". Мне может потребоваться совпадение с "this" или "действительно", или мне может потребоваться совпадение "eall" или "reat".

4b9b3361

Ответ 1

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

String[] pattern_list = whatever;
String regex = String.Format("({0})", String.Join("|", pattern_list));

Ответ 2

(good)*(great)*

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

\b(g*o*o*d*)*(g*r*e*a*t*)*\b

Ответ 3

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

Если вы хотите совместить "большой" или "reat" , вы можете выразить это по шаблону, например:

"g?reat"

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

Это будет соответствовать "reat" и "great", но не "есть", потому что требуется первый "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" .

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

Ответ 4

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

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/

Ответ 5

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

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

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

* J * ohn * a * nd Shelly * a * re

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

на мой взгляд, Дерево Суффикс может помочь вам с этим

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

пользоваться.

Ответ 6

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

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

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