Skip to main content
 首页 » 编程设计

c#之正则表达式在正则表达式测试器中工作,但在 C# 中不起作用

2024年01月13日36JeffreyZhao

我搜索了一下,但很难判断之前是否有人回答过这个确切的问题。我知道如果这是重复的,您会告诉我的。

我有一个正则表达式匹配一系列一个或多个前面有反斜杠的正整数。例如:\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; 
} 

请您参考如下方法:

问题是这一行:

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;