我需要创建一个可以匹配多个字符串的正则表达式。例如,我想找到“好”或“好”的所有实例。我找到了一些例子,但我想出来的似乎不起作用:
\b(good|great)\w*\b
有人能指出我正确的方向吗?
编辑:我应该注意,我不想只匹配整个单词。例如,我可能想要匹配“ood”或“reat”(部分单词)。
编辑2:以下是一些示例文字:“这是一个非常棒的故事。” 我可能想要匹配“this”或“really”,或者我可能想匹配“eall”或“reat”。
答案 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”的完整单词。
这就是你要找的东西吗?