我正在使用以下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 PRODUCT
,COMPANY PART NUMBER
等)来自COMPANY PRICE (INC VAT)
的aprt。
当我调用以下内容时,它只返回一个空字符串(""
):
var companyPrice = ExtractRawString(inputString, "COMPANY PRICE (INC VAT)");
我尝试用(.+?)
替换Regex
中的(.)
,但结果相同。
当格式与所有其他字段相同时,有人能告诉为什么这会返回一个空字符串吗?
答案 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#中?我会考虑确保首先发生。