正则表达式在regex测试器中工作,但不在c#中

时间:2014-07-10 21:59:54

标签: c# regex

我已经搜索了一下,但很难说这个问题是否已经得到了回答。我知道你会告诉我这是否重复。

我有一个正则表达式,它匹配一系列一个或多个前面带反斜杠的正整数。例如:\ 12345匹配,但\ 1234f或12345不匹配。

我正在使用的正则表达式是 ^ \\(\ d +)$

当我使用各种测试仪测试表达时,它可以工作。例如,请参阅:http://regex101.com/r/cY2bI1/1

但是,当我在以下c#代码中实现它时,我无法获得匹配。

实施:

public string ParseRawUrlAsAssetNumber(string rawUrl) {
    var result = string.Empty;
    const string expression = @"^\\([0-9]+)$";
    var rx = new Regex(expression);
    var matches = rx.Matches(rawUrl);
    if (matches.Count > 0)
    {
        result = matches[0].Value;
    }
    return result;
}

失败的测试(NUnit):

[Test]
public void ParseRawUrlAsAssetNumber_Normally_ParsesTheUrl() {
    var f = new Forwarder();
    var validRawUrl = @"\12345";
    var actualResult = f.ParseRawUrlAsAssetNumber(validRawUrl);
    var expectedResult = "12345";
    Assert.AreEqual(expectedResult, actualResult);
}

测试的输出:

Expected string length 5 but was 6. Strings differ at index 0.
Expected: "12345"
But was:  "\\12345"
-----------^

有什么想法吗?

解决:

感谢大家的投入。最后,我根据您的建议采取了以下路线,现在正在通过测试。

public string ParseRawUrlAsAssetNumber(string rawUrl)
{
    var result = string.Empty;
    const string expression = @"^\\([0-9]+)$";
    var rx = new Regex(expression);
    var matches = rx.Matches(rawUrl);
    if (matches.Count > 0)
    {
        result = matches[0].Groups[1].Value;
    }
    return result;
}

3 个答案:

答案 0 :(得分:7)

问题在于这一行:

var rx = new Regex(Regex.Escape(expression));

通过转义表达式,您将所有特殊的正则表达式字符转换为文字。致电Regex.Escape(@"^\\(\d+)$")将返回"\^\\\\\(\\d\+\)\$"匹配文字字符串"^\\(\d+)$"

试试这个:

var rx = new Regex(expression);

有关完整说明以及如何使用此方法的示例,请参阅MSDN:Regex.Escape


鉴于您的更新问题,您似乎也遇到了问题:

result = matches[0].Value;

这将返回整个匹配的子字符串,而不仅仅是第一个捕获组。为此你必须使用:

result = matches[0].Groups[1].Value;

答案 1 :(得分:3)

不要逃避模式。也可以简单地使用Regex.Match,这样你就可以在这里进行单一匹配。使用Match.Success检查输入是否与您的模式匹配。并返回值 - 数字位于匹配表达式的组中:

public string ParseRawUrlAsAssetNumber(string rawUrl)
{            
    const string pattern = @"^\\(\d+)$";

    var match = Regex.Match(rawUrl, pattern);
    if (!match.Success)
        return String.Empty;

    return match.Groups[1].Value;
}

答案 2 :(得分:1)

如果您尝试获取组结果,该怎么办?

match.Groups[1].Value

当我到真正的计算机时,我会进行测试,但似乎应该可以正常工作