正则表达式匹配多个字符串

时间:2009-03-30 19:03:33

标签: c# regex

我需要创建一个可以匹配多个字符串的正则表达式。例如,我想找到“好”或“好”的所有实例。我找到了一些例子,但我想出来的似乎不起作用:

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

有人能指出我正确的方向吗?

编辑:我应该注意,我不想只匹配整个单词。例如,我可能想要匹配“ood”或“reat”(部分单词)。

编辑2:以下是一些示例文字:“这是一个非常棒的故事。” 我可能想要匹配“this”或“really”,或者我可能想匹配“eall”或“reat”。

6 个答案:

答案 0 :(得分:22)

如果您可以保证单词列表中没有保留的正则表达式字符(或者如果您将其转义),则可以使用此代码将a big word list转换为@"(a|big|word|list)"|运算符在您使用它时没有任何问题,只要()围绕它。听起来\w*\b模式会干扰您的匹配。

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

答案 1 :(得分:4)

(good)*(great)*
编辑后

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

答案 2 :(得分:1)

我不完全确定正则表达式可以为您要做的事情提供解决方案。但是,您可以使用以下代码为给定单词创建正则表达式。虽然, 生成的正则表达式模式有可能变得非常长而且很慢

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/

答案 3 :(得分:1)

我认为你要求的是你并不是真的意思 如果你想搜索单词的任何部分,你就可以搜索字母

e.g。在“John and Shelly很酷”中搜索{Jack,Jim}

正在搜索名称{J,a,c,k,i,m}

中的所有字母

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

为此您不需要REG-EX:)

在我看来, 后缀树可以帮助您实现

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

享受。

答案 4 :(得分:1)

只需检查Regex.IsMatch()返回的布尔值。

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

该行将同时具有正则表达式。

答案 5 :(得分:0)

我无法正确理解问题:

如果你想匹配“伟大”或“reat”,你可以通过以下模式来表达:

"g?reat"

这简单地说“reat”-part必须存在,而“g”是可选的。

这将匹配“reat”和“great”但不匹配“eat”,因为“reat”中的第一个“r”是必需的。

如果你有太多“伟大”和“好”的词,你想要将它们与可选的“g”相匹配,你可以这样写:

(g?reat|g?ood)

如果您想要包含像:

这样的单词边界
\b(g?reat|g?ood)

你应该知道这与“呼吸”之类的东西都不匹配,因为你有“reat”但是由于“b”而“r”不在单词边界。

因此,如果你想匹配包含子串链接“reat”或“ood”的整个单词,那么你应该尝试:

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

这是:    1.从单词边界开始,开始匹配任意数字的单词字符,但不要用。    2.匹配“reat”或“ood”,确保只匹配包含其中一个的单词。    3.匹配“reat”或“ood”之后的任意数量的单词字符,直到达到下一个单词边界。

这将匹配:

“善良”,“好”,“ood”(如果一个完整的词)

可以理解为:给我所有包含“ood”或“reat”的完整单词。

这就是你要找的东西吗?