Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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,我一直在试图理解Regex.Replace调用的输出,但我对它的输出感到困惑 我有一本字典。我想搜索输入字符串中的键,如果字符串存在于字符串的开头,在字符串的结尾,或者在字符串的中间,如果每个边都有一个或多个空格,则用相应的值替换它们。p> 我的输入字符串如下所示: North S West N East W South E W S N West South 此代码中的正则表达式如下所示: (^| +?)SOUTH($| +?)|(^| +?)NORTH($| +?)|(^| +?)EAST(

我一直在试图理解Regex.Replace调用的输出,但我对它的输出感到困惑

我有一本字典。我想搜索输入字符串中的键,如果字符串存在于字符串的开头,在字符串的结尾,或者在字符串的中间,如果每个边都有一个或多个空格,则用相应的值替换它们。p> 我的输入字符串如下所示:

North S West N East W South E W S N West South
此代码中的正则表达式如下所示:

(^| +?)SOUTH($| +?)|(^| +?)NORTH($| +?)|(^| +?)EAST($| +?)|(^| +?)WEST($| +?)|(^| +?)E($| +?)|(^| +?)W($| +?)|(^| +?)N($| +?)|(^| +?)S($| +?)
我的预期产出是:

N SOUTH W NORTH E WEST S EAST WEST SOUTH NORTH W S
N S W N E W S E WEST S NORTH WEST S
我的实际产出是:

N SOUTH W NORTH E WEST S EAST WEST SOUTH NORTH W S
N S W N E W S E WEST S NORTH WEST S
代码如下。正则表达式模式是根据字典的键构造的。我觉得我只是误解了一些关于正则表达式的简单内容。为什么它选择了一些单词而不是全部?例如,为什么它与字符串末尾附近的单词West不匹配,而与字符串开头附近的单词West匹配?我已经添加了代码来编写每个匹配项和模式字符串,但是我被难住了

void Main()
{
        var directions = new Dictionary<string, string>
        {
            {"SOUTH", "S"},
            {"NORTH", "N"},
            {"EAST", "E"},
            {"WEST", "W"},
            {"E", "EAST"},
            {"W", "WEST"},
            {"N", "NORTH"},
            {"S", "SOUTH"},
        };

        string input = @"North S West N East W South E W S N West South";

        Console.WriteLine(doReplace(input, directions));
}

private string doReplace(string input, Dictionary<string, string> lookup)
{
    string output = null;

    //Construct the regular expression pattern
    string searchPattern = string.Join(@"|", lookup.Select(s => @"(^| +?)" + s.Key + @"($| +?)").ToArray());
    Console.WriteLine(searchPattern);

    //Perform the replace
    output = Regex.Replace(input.ToUpper(), searchPattern, new MatchEvaluator(m =>
    {
        //Write out each match found
        Console.WriteLine("[{0}]", m.Value);

        string tmp = m.Value.Trim();
        string result = tmp;
        lookup.TryGetValue(tmp, out result);

        //This return statement is for the lambda not the method.
        return m.Value.Replace(tmp, result);
    }), RegexOptions.ExplicitCapture|RegexOptions.Singleline);

    return output;
}
void Main()
{
var方向=新字典
{
{“南”,“S”},
{“北”,“N”},
{“东”,“东”},
{“西”,“西”},
{“E”,“东”},
{“W”,“WEST”},
{“N”,“NORTH”},
{“S”,“南”},
};
字符串输入=@“北-南-西-北-东-西-南-东-西-西-南”;
控制台写入线(数据替换(输入,方向));
}
私有字符串数据替换(字符串输入、字典查找)
{
字符串输出=null;
//构造正则表达式模式
string searchPattern=string.Join(@“|”),lookup.Select(s=>@“(^ |+?)”+s.Key++“($|+?)”)”.ToArray();
控制台写入线(搜索模式);
//执行替换
output=Regex.Replace(input.ToUpper()、searchPattern、newmatchEvaluator(m=>
{
//写出找到的每个匹配项
WriteLine(“[{0}]”,m.Value);
字符串tmp=m.Value.Trim();
字符串结果=tmp;
TryGetValue(tmp,输出结果);
//此返回语句用于lambda而不是方法。
返回m.Value.Replace(tmp,结果);
}),RegexOptions.ExplicitCapture | RegexOptions.Singleline);
返回输出;
}

您的问题是正则表达式的元素(除非匹配项位于字符串的开头/结尾)在匹配前后至少需要一个空格:

(^| +?)SOUTH($| +?)
匹配一个空格,然后是
,然后是另一个空格。现在,如果下一个可能的匹配在此之后开始,那么必须有第二个空格字符来开始下一个匹配。但是单词之间只有一个空格,所以最多其他单词可以匹配

例如,您可以将其可视化


如果您的目标是只匹配整个单词而不是子字符串,请使用
\b
\bSOUTH\b
将匹配
SOUTH
但不匹配
SOUTHERN

@user2864740-实际的正则表达式是在代码中构造的,并使用Console.WriteLine输出,但我已经用值更新了问题。@user2864740-我不知道您还想要什么。我发布了常规的eXpression、输入、预期输出和实际输出。我还发布了一个简短但完整的程序,可以产生相同的结果。请让我知道我还能提供什么。当使用:
@(?:^\s*)南、北、东、西、东、西(?$)\s*)“
作为正则表达式时会发生什么情况?@user2864740-这似乎会产生正确的输出。我认为我的正则表达式有点不对劲,但你知道它为什么表现得那么奇怪吗?谢谢,我将继续测试。我将尝试使用单词边界锚。我的目标之一是用一个单独的正则表达式替换3个单独的正则表达式。因此,如果我有三个不同的正则表达式:“^SOUTH”和“SOUTH”以及“SOUTH$”,我将如何实现这一点?(单引号仅供评论)@ChrisDunaway:
\bSOUTH\b
将处理这三个问题。尝试
\b(南|北|西|东|南|北|西|东)\b
——涵盖所有情况。