匹配返回空字符串

时间:2017-05-09 12:03:27

标签: c# regex string

我正在使用以下Regex从字符串中提取数据:

private static string ExtractRawString(string input, string fieldName)
{
    return Regex.Match(input, $@"{fieldName}:(.+?)\n").Groups[1].Value;
}

输入字符串为:

NAME OF PRODUCT:         Product 30AMP \n \nCOMPANY PART NUMBER:   11111\nOEM COMPANY:   COMPANY2 \n \nADD IMAGE HERE:    \n \n \n \n - CHECKED \n \n  \nOEM PART NUMBER:  22222 \nSERIAL NUMBER:  33333 \nCLASSIFICATION:   Product \nDIMENSIONS: UNKNOWN \nWEIGHT:  0.06Kg’s \nCOMPANY PRICE (INC VAT):  R 450.53 ZAR \nOEM PRICE:  \nCoO:  USA/MEXICO \n 

例如,我可以像这样调用函数:

var productName = ExtractRawString(inputString, "NAME OF PRODUCT");

这适用于输入字符串中的每个字段(例如NAME OF PRODUCTCOMPANY PART NUMBER等)来自COMPANY PRICE (INC VAT)的aprt。

当我调用以下内容时,它只返回一个空字符串(""):

var companyPrice = ExtractRawString(inputString, "COMPANY PRICE (INC VAT)");

我尝试用(.+?)替换Regex中的(.),但结果相同。

当格​​式与所有其他字段相同时,有人能告诉为什么这会返回一个空字符串吗?

2 个答案:

答案 0 :(得分:4)

您需要转义密钥名称,否则()将被视为分组构造运算符。这可以使用Regex.Escape()方法完成。

此外,模式的:(.+?)\n部分需要存在换行符。您需要使用贪婪量词版本并删除\n,因为.匹配任何字符,但是.NET正则表达式中的换行符:

$@"{Regex.Escape(fieldName)}:(.+)"

在这里,Regex.Escape()会在任何特殊的正则表达式字符前面添加文字反斜杠,以便(可以匹配文字(等。贪婪的量词将抓取1个或更多非-newline chars一下子,而懒惰的一个(+?)让正则表达式引擎跳过量化的模式,并试图匹配换行符,这使得\n成为必需的模式部分并使模式变得相当低效的。

请注意,为了使.匹配任何字符而不是换行符,您不应将RegexOptions.Singleline选项传递给Regex构造函数。如果您无法控制,请使用这样的修饰符组使.匹配非换行符:

$@"{Regex.Escape(fieldName)}:((?-s:.+))"
                              ^^^^^  ^

an online .NET regex tester上查看示例COMPANY PRICE \(INC VAT\):((?-s:.+)) regex演示。

答案 1 :(得分:1)

Aren的括号在字符串中用三重括号转义,在C#中?我会考虑确保首先发生。