Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(对我来说)C#(正则表达式?)中的字符串解析很困难_C#_Regex - Fatal编程技术网

(对我来说)C#(正则表达式?)中的字符串解析很困难

(对我来说)C#(正则表达式?)中的字符串解析很困难,c#,regex,C#,Regex,我需要帮助来解析大量文本中的一些信息,基本上我正在导入一个PSD文件,并希望解析其中的一些数据 文本中包含如下字符串: \r\nj78876随机文本字符串75 现在我要做的是获取所有符合此格式的字符串(可能起始“\r\n”和结束“£”可以是分隔符),并在开始(j78876)获取代码,在结束(75)获取价格。注:价格可能超过2位数 然后我想获取代码,比如j78876,以及每个字符串的价格,就像这样,它们会出现很多次(不同的代码和价格) 有人能建议一种方法吗 我不是很精通正则表达式,所以指导会很好

我需要帮助来解析大量文本中的一些信息,基本上我正在导入一个PSD文件,并希望解析其中的一些数据

文本中包含如下字符串:

\r\nj78876随机文本字符串75

现在我要做的是获取所有符合此格式的字符串(可能起始“\r\n”和结束“£”可以是分隔符),并在开始(j78876)获取代码,在结束(75)获取价格。注:价格可能超过2位数

然后我想获取代码,比如j78876,以及每个字符串的价格,就像这样,它们会出现很多次(不同的代码和价格)

有人能建议一种方法吗

我不是很精通正则表达式,所以指导会很好

谢谢

注意:这里是实际文本的剪贴(实际文件中还有很多)

法国复古法国3Com/H3C LibelléRemarque大奖赛\R\nJ9449A HP V1810-8G 交换机139,00\r\nJ9450A HP V1810-24G交换机359,00\r\nEdge交换机-托管\r\nHP层 2个交换机-受管可堆叠设备和机箱\r\nHP交换机2510系列\r\nRéférence辅助设备 référence 3Com/H3C LibelléRemarque Prix en€\r\nJ9019B HP E2510-24交换机359,00\r\n \nJ9020A HP E2510-48开关599,00\r\nJ9279A HP E2510-24G开关779,00\r\nJ9280A HP E2510-48G开关1 569,00\r\nHP开关2520系列 3Com/H3C LibelléRemarque Prix en€\r\nJ9137A HP E2520-8-PoE交换机489,00\r\nJ9138A HP E2520-24-PoE开关779,00\r\nJ9298A HP E2520-8G-PoE开关749,00\r\nJ9299A HP E2520- 24G PoE交换机1 569,00\r\nHP第2层和第3层交换机-受管可堆叠设备和机箱\r\n \RBP仅为推荐价格\r\nHP开关2600系列\r\n应急辅助设备

更新 我发现:

[\\r\\n](\w\d+\w).*?(\d+,\d\d)[\\r\\n]
曾在regex浏览器测试程序中为我工作,但不会在我的C#代码中工作

最后更新: 在浏览器测试程序中,我必须双重转义\r\n-在我的代码中,这是不必要的。然后,我使用循环答案来循环分组

foreach (Match match in Regex.Matches(content, @"[\r\n](?<code>\w\d+\w).*?(?<price>\d+,\d\d)[\r\n]", RegexOptions.IgnoreCase))
{
    string code = match.Groups["code"].Value;
    string currencyAmt = match.Groups["price"].Value;
}
foreach(Regex.Matches中的匹配(内容,@“[\r\n](?
\w\d+\w)。*?(?\d+,\d\d)[\r\n]”,RegexOptions.IgnoreCase))
{
字符串代码=匹配。组[“代码”]。值;
字符串currencyAmt=match.Groups[“price”].Value;
}

好的,你的问题是一个移动的目标。实际文本样本(与您的问题相矛盾)中没有。下面是一个经过改编的表达:

new Regex(@"\r\n(\w+?).*?\s+(\d+?,\d\d)")
在散文中(这毕竟是一个学习网站):匹配“\r\n”后跟任何字母数字,直到找到空白,然后匹配任何字母数字,直到找到空白,后跟逗号后面有两位数字的数字。将捕获斜体部分

正如我所说,我不做Obj-C,因此无法测试它。有关如何使用它,请参见(以及此处的其他答案)

Regex reg = new Regex(@"\r\n([a-z]\d+\w)\s.*\s(\d+\,?\d+?)\r\n", RegexOptions.IgnoreCase);
string productCode, productCost;
foreach (Match match in reg.Matches(str))
{
    productCode = match.Groups[1].Value;
    productCost = match.Groups[2].Value;
    //do something with values here
}
编辑,因为我的原始答案是错误的。
根据您的样品,以上工作正常。
新正则表达式的第一个参数的快速正则表达式解释(:

@:使字符串保持不变,使我不必到处添加额外的转义符。
\r\n:以开头。
([a-z]\d+\w)\s:与您的产品代码相匹配,我使用了\s框,因为它看起来是一个一致的空白。
*:匹配您的随机生产描述字符串。
\s(\d+\,?\d+?):匹配一个空格,后跟您对某种货币的第二次捕获。
\r\n:以结束


如果您提供了更大的样本数据集,我可以对正则表达式进行微调。

我将使用命名组来更容易地标识组。表达式的
部分标识组

您将希望使用匹配项,正如您所说的,文本中会出现多个模式。这将遍历所有模式

foreach ( Match match in Regex.Matches(text, @"\r\n(?<code>\S+).*?(?<price>\d+)£") )
{
    string code = match.Groups["code"].Value;
    string currencyAmt = match.Groups["price"].Value;
    Console.WriteLine(code);
    Console.WriteLine(currencyAmt);
}
foreach(匹配正则表达式中的匹配项。匹配项(文本,@“\r\n(?
\S+).*(?\d+))
{
字符串代码=匹配。组[“代码”]。值;
字符串currencyAmt=match.Groups[“price”].Value;
控制台写入线(代码);
控制台写入线(当前金额);
}
最终结果如下:

foreach (Match match in Regex.Matches(content, @"[\r\n](?<code>\w\d+\w).*?(?<price>\d+,\d\d)[\r\n]", RegexOptions.IgnoreCase))
{
    string code = match.Groups["code"].Value;
    string currencyAmt = match.Groups["price"].Value;
}
foreach(Regex.Matches中的匹配(内容,@“[\r\n](?
\w\d+\w)。*?(?\d+,\d\d)[\r\n]”,RegexOptions.IgnoreCase))
{
字符串代码=匹配。组[“代码”]。值;
字符串currencyAmt=match.Groups[“price”].Value;
}

您添加的示例数据提出的问题比它回答的问题多。我们是否应该将这些
\r\n
序列视为回车+换行(CRLF),或作为文字?此外,它看起来像是在随机位置插入了空格字符——在某些情况下,甚至是在
\r
\n
之间。哦,没有英镑符号(
),只有欧元符号(
),而且它们从来没有像您最初指出的那样与价格在同一行

若那个样本真的代表了你们的数据,你们应该在开始搜索之前尝试清理它(或者让提供给你们的人清理它)。我这样做只是为了测试我的正则表达式;若我做了任何错误的假设,请让我知道。这里是:

  Regex rgx = new Regex(@"^(\w+).*?(\d+,\d\d)(?:[\r\n]+|\z)", RegexOptions.Multiline);

  string s = @"Référence Ancienne référence 3Com/H3C Libellé Remarque Prix en €
J9449A HP V1810-8G Switch 139,00
J9450A HP V1810-24G Switch 359,00
Edge Switches - Managed 
HP Layer 2 Switches - Managed Stackables and Chassis
HP Switch 2510 Series
Référence Ancienne référence 3Com/H3C Libellé Remarque Prix en €
J9019B HP E2510-24 Switch 359,00
J9020A HP E2510-48 Switch 599,00
J9279A HP E2510-24G Switch 779,00
J9280A HP E2510-48G Switch 1 569,00
HP Switch 2520 Series
Référence Ancienne référence 3Com/H3C Libellé Remarque Prix en €
J9137A HP E2520-8-PoE Switch 489,00
J9138A HP E2520-24-PoE Switch 779,00
J9298A HP E2520-8G-PoE Switch 749,00
J9299A HP E2520-24G-PoE Switch 1 569,00
HP Layer 2 and 3 Switches - Managed Stackables and Chassis
The RBP is a recommended price only. 
HP Switch 2600 Series
Référence Ancienne";

  foreach (Match m in rgx.Matches(s))
  {
    Console.WriteLine("code: {0}; price: {1}", 
        m.Groups[1].Value, m.Groups[2].Value);
  }
输出:

code: J9449A; price: 139,00
code: J9450A; price: 359,00
code: J9019B; price: 359,00
code: J9020A; price: 599,00
code: J9279A; price: 779,00
code: J9280A; price: 569,00
code: J9137A; price: 489,00
code: J9138A; price: 779,00
code: J9298A; price: 749,00
code: J9299A; price: 569,00

多行模式下的
^
足以在行首锚定匹配;您不必匹配行分隔符(
\r\n
)本身。您应该能够以同样的方式使用
$
,但这不起作用,因为.NET不将
\r
视为行分隔符。相反,我直接使用了:
(?:[\r\n]+\z)

您的价格是75吗?这真的取决于什么字符是“随机文本字符串”可以包含--包括空格信息。您好,Jon,是的,随机文本是各种文本-带有空格的段落,回车符返回“\r\n”等,但不包含£符号-因此我想找一个“£”,然后返回“\r\n”作为字符串标记分隔符。您的最终更新在部分中有问题。*(
code: J9449A; price: 139,00
code: J9450A; price: 359,00
code: J9019B; price: 359,00
code: J9020A; price: 599,00
code: J9279A; price: 779,00
code: J9280A; price: 569,00
code: J9137A; price: 489,00
code: J9138A; price: 779,00
code: J9298A; price: 749,00
code: J9299A; price: 569,00