4

取以下字符串:“互联网上的营销和板球”。

我想使用正则表达式查找“​​Ma”-any text-“et”的所有可能匹配项。所以..

  • 市场
  • 营销和板球
  • 互联网上的营销和板球

正则表达式Ma.*et返回“互联网营销和板球”。正则表达式Ma.*?et返回市场。但我想要一个返回所有 3 的正则表达式。这可能吗?

谢谢。

4

4 回答 4

2

据我所知:没有。

但是您可以先匹配非贪婪,然后使用量词生成一个新的正则表达式以获得第二个匹配。像这样:

Ma.*?et
Ma.{3,}?et

...等等...

于 2010-11-03T21:08:09.523 回答
1

谢谢大家,这真的很有帮助。这是我想出的PHP:

function preg_match_ubergreedy($regex,$text) {

    for($i=0;$i<strlen($text);$i++) {
        $exp = str_replace("*","{".$i."}",$regex);
        preg_match($exp,$text,$matches);
        if($matches[0]) {
            $matched[] = $matches[0];
        }
    }

    return $matched;

}
$text = "Marketing and Cricket on the Internet";
$matches = preg_match_ubergreedy("@Ma.*?et@is",$text);
于 2010-11-03T21:32:52.980 回答
0

遗憾的是,这对于标准 POSIX 正则表达式是不可能的,它返回单个(最佳候选,每个正则表达式规则)匹配。假设您在程序中使用它,您将需要利用扩展功能,该功能可能存在于您使用此正则表达式的特定编程语言中,以完成此任务。

于 2010-11-03T21:04:53.837 回答
0

对于更通用的正则表达式,另一种选择是将贪婪的正则表达式与前一个匹配递归匹配,依次丢弃第一个和最后一个字符以确保您只匹配前一个匹配的子字符串。匹配后Marketing and Cricket on the Internet,我们测试arketing and Cricket on the Internet和子匹配Marketing and Cricket on the Interne

它在 C# 中是这样的......

public static IEnumerable<Match> SubMatches(Regex r, string input)
{
    var result = new List<Match>();

    var matches = r.Matches(input);
    foreach (Match m in matches)
    {
        result.Add(m);

        if (m.Value.Length > 1)
        {
            string prefix = m.Value.Substring(0, m.Value.Length - 1);
            result.AddRange(SubMatches(r, prefix));

            string suffix = m.Value.Substring(1);
            result.AddRange(SubMatches(r, suffix));
        }

    }

    return result;
}

但是,此版本最终可能会多次返回相同的子匹配,例如它会在 中找到Marmoset两次Marketing and Marmosets on the Internet,首先是 的子匹配Marketing and Marmosets on the Internet,然后是 的子匹配Marmosets on the Internet

于 2010-11-03T22:24:29.110 回答