我搜索了一下,但很难判断之前是否有人回答过这个确切的问题。我知道如果这是重复的,您会告诉我的。
我有一个正则表达式匹配一系列一个或多个前面有反斜杠的正整数。例如:\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;
