我已经搜索了一下,但很难说这个问题是否已经得到了回答。我知道你会告诉我这是否重复。
我有一个正则表达式,它匹配一系列一个或多个前面带反斜杠的正整数。例如:\ 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;
}
答案 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
当我到真正的计算机时,我会进行测试,但似乎应该可以正常工作