Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用正则表达式选择最长匹配?_C#_Regex - Fatal编程技术网

C# 如何使用正则表达式选择最长匹配?

C# 如何使用正则表达式选择最长匹配?,c#,regex,C#,Regex,我试图寻找这个问题的答案,但就是找不到任何答案,我希望有一个简单的解决办法。我在C#中使用了以下代码 问题是,matches方法是否有办法首先返回最长的模式?在这种情况下,我希望得到“hello world”作为我的匹配项,而不仅仅是“hello”。这只是一个例子,但我的模式列表包含了相当多的单词。如果您事先已经知道单词的长度,那么请将最长的放在第一位。例如: String pattern = ("(hello world|hello)"); 最长的将首先匹配。如果你事先不知道长度,这是不可能

我试图寻找这个问题的答案,但就是找不到任何答案,我希望有一个简单的解决办法。我在C#中使用了以下代码


问题是,matches方法是否有办法首先返回最长的模式?在这种情况下,我希望得到“hello world”作为我的匹配项,而不仅仅是“hello”。这只是一个例子,但我的模式列表包含了相当多的单词。

如果您事先已经知道单词的长度,那么请将最长的放在第一位。例如:

String pattern = ("(hello world|hello)");
最长的将首先匹配。如果你事先不知道长度,这是不可能的


另一种方法是将所有匹配项存储在数组/哈希/列表中,并使用该语言的内置函数手动选择最长的匹配项。

生成两个不同的正则表达式匹配项。第一个选项将匹配较长的选项,如果不起作用,第二个选项将匹配较短的选项

string input = "hello world";

string patternFull = "hello world";
Regex regexFull = new Regex(patternFull, RegexOptions.IgnoreCase);

var matches = regexFull.Matches(input);

if (matches.Count == 0)
{
    string patternShort = "hello";
    Regex regexShort = new Regex(patternShort, RegexOptions.IgnoreCase);
    matches = regexShort.Matches(input);
}
最后,
匹配
将是“满”或“短路”的输出,但将首先检查“满”,如果为真,则将短路

如果计划多次调用,可以将逻辑封装到函数中。这是我想到的(但是你可以用很多其他的方法)

正则表达式(将尝试)从左到右匹配模式。如果要确保首先获得尽可能长的匹配,则需要更改模式的顺序。首先尝试最左侧的模式。如果找到与该模式的匹配,正则表达式引擎将尝试将该模式的其余部分与字符串的其余部分进行匹配;只有在找不到匹配项时,才会尝试下一个模式

String pattern = ("(hello world|hello wor|hello)");

实际上,我正试图避免这样做,因为模式字符串实际上包含很多单词/关键字。您可以将每个正则表达式调用包装在一个函数中,并多次调用它。这将减少大量的复制粘贴代码。@user3749947如果您正在搜索许多可能的单词,那么
字典
可能更合适。@ClickRick,一个
列表
可能会更好。对于字典,我可以理解将模式放在键字段中,但不需要值字段。但是,我所写的只是一种方法。这很有效!按照单词的长度对模式进行排序就成功了。谢谢如果有很多单词可以匹配,为什么你建议使用
Regex
而不是
字典?
public bool HasRegexMatchInOrder(string input, params string[] patterns)
{
    foreach (var pattern in patterns)
    {
        Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);

        if (regex.IsMatch(input))
        {
            return true;
        }
    }

    return false;
}

string input = "hello world";
bool hasAMatch = HasRegexMatchInOrder(input, "hello world", "hello", ...);
String pattern = ("(hello world|hello wor|hello)");