首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C# (regex?)中的字符串解析困难(对我来说)?

C# (regex?)中的字符串解析困难(对我来说)?
EN

Stack Overflow用户
提问于 2011-03-22 09:02:18
回答 5查看 940关注 0票数 2

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

文本中有字符串,如下所示:

\r\£78876随机文本字符串75£

现在,我想要做的是抓取符合这种格式的所有字符串(可能开始的"\r\n“和结尾的”at“可以是分隔符),并在开始时获取代码(j78876)和在末尾的价格(75)。注:价格可能比2位数更多。

然后,我想获取代码,如j78876和每个字符串的价格,这是因为它们会出现很多次(不同的代码和价格)。

有人能想出办法吗?

我对Regex不是很精通,所以指导会很棒。

谢谢。

注意:下面是实际文本的片段(实际文件中有更多内容)。

3 3Com/H3C LibelléRemarque Prix en欧元\r\nJ9449A HP V1810-8G开关139,00\r\nJ9450A HP V 1810-24g开关359,00\r \n边缘开关-管理的\r\nHP层2开关-管理的堆栈和底盘\r\nHP开关2510系列\r\réréréféréfé3Com/H3C LibelléRemarque Prix en欧元\r\nJ9019B HP E2510-24开关359 \nJ9020A HP E2510-48 599开关\r 9Hp 9Hp 27910 E10E10变送器nHP交换机2520系列\r\nRérérence 3 3Com/H3C LibelléRemarque Prix en en\nJ9137A HP E 2520-8-8-PoE开关489,00\r\nJ9138A HP E2520-24-PoE开关779,00HP E2520-8G-PoE 9299A HP E2520-24G-POJ 9299A HP E2520-24g-PoE开关1 569,r\nHP层2和3开关-托管堆栈和底盘- RBP仅为推荐价格。\r\nR开关2600系列\réréférence Ancienne

更新我发现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[\\r\\n](\w\d+\w).*?(\d+,\d\d)[\\r\\n]

在regex浏览器测试器中为我工作过,但不会在我的C#代码中工作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Regex reg = new Regex(@"[\\r\\n](\w\d+\w).*?(\d+,\d\d)[\\r\\n]", RegexOptions.IgnoreCase);
Match matched = reg.Match(str);
if (matched.Success)
{
    string code = matched.Groups[1].Value;
    string currencyAmt = matched.Groups[2].Value;
}

最后更新:在浏览器测试人员中,我不得不双转义\r\n --在我的代码中,这是不必要的。然后,为了循环分组,我使用了循环答案。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-22 09:29:09

我会使用命名组来更容易地识别组。表达式的?<code>部分标识组。

您将希望使用匹配,正如您所说的,在您的文本中会出现几个匹配的模式。这会把它们都循环起来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2011-03-22 09:09:20

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}

因为我原来的答案是错的。

根据你的样本,以上作品。

对新regex第一个参数的快速Regex解释(:

@:使我的字符串常量,使我不必在任何地方添加额外的转义符。

\n:从。

( as \d+\w) \s :与您的产品代码匹配,我使用\s对其进行了框架化,因为它似乎是一个一致的空白。

.*:匹配您的随机产品描述字符串。

\s(\d+\,?\d+?):匹配空格,然后是第二次捕获某种货币。

结束于。

如果您提供了一个更大的示例数据集,我可以微调regex。

票数 3
EN

Stack Overflow用户

发布于 2011-03-22 09:06:10

好吧,你的问题是一个移动的目标。实际的文本示例(与您的问题相矛盾)中没有£。以下是一个经过调整的表达:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new Regex(@"\r\n(\w+?).*?\s+(\d+?,\d\d)")

在散文中(这毕竟是一个学习站点):匹配"\r\n“,后面跟着任何字母数字,直到您到达空格为止,然后是任何东西,直到您点击空格,后面跟着一个数字,后面有两个数字的逗号。用斜体表示的部分被捕获。

正如我所说,我不做Obj,因此不能测试它。关于如何使用它,请参见这些C#文档 (以及这里的其他答案)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5395016

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文