C# 稍微复杂的web文本到变量解析
我从一个网站上获取文本并将其解析为变量。然而,当我拉文本时得到的字符串有点复杂。在网上看起来是这样的C# 稍微复杂的web文本到变量解析,c#,parsing,web,C#,Parsing,Web,我从一个网站上获取文本并将其解析为变量。然而,当我拉文本时得到的字符串有点复杂。在网上看起来是这样的 Invoice #: 1267 Date: 4/16/2018 10:44:00 AM PO #: Reference: Countermen: A/A 我遇到的问题是,所有这些都是一个字符串。字符串也会动态变化,因为一些订单输入了文本,而其他订单没有。例如,某些订单的每个字段都已填写,而其他订单几乎没有填写字段 Invoice #: 1267 <br> Date: 4/16/
Invoice #: 1267
Date: 4/16/2018 10:44:00 AM
PO #:
Reference:
Countermen: A/A
我遇到的问题是,所有这些都是一个字符串。字符串也会动态变化,因为一些订单输入了文本,而其他订单没有。例如,某些订单的每个字段都已填写,而其他订单几乎没有填写字段
Invoice #:
1267
<br>
Date:
4/16/2018 10:44:00 AM
<br>
PO #:
<br>
Reference:
<br>
Countermen:
A/A
发票#:
1267
日期:
2018年4月16日上午10:44:00
PO#:
参考:
柜台人员:
A/A
这是我检查web元素时显示的内容
我想将信息解析成单个字符串和整数进行测试,但我很难处理字符串的整个“动态”部分,因为有些字符串会更长,而有些字符串会更短
以下是一些实际网站的图片,如果有帮助的话:
您可以使用简单的正则表达式
\s*
匹配任何空白,并且(.*?
匹配在空白之间找到的任何内容。结尾处的$
强制它匹配计数器
后面的所有文本,这一点很重要:
string sb = "Invoice #:" +
"1267" +
"<br>" +
"Date:" +
"4/16/2018 10:44:00 AM" +
"<br>" +
"PO #:" +
"<br>" +
"Reference:" +
"<br>" +
"Countermen:" +
"A/A";
var matches = Regex.Match(sb,
@"Invoice #:\s*(.*?)\s*<br>\s*Date:\s*(.*?)\s*<br>\s*PO #:\s*(.*?)\s*<br>\s*Reference:\s*(.*?)\s*<br>\s*Countermen:\s*(.*?)\s*$");
if (!matches.Success)
{
throw new Exception("Unable to parse");
}
var invoice = matches.Groups[1].Value;
var date = matches.Groups[2].Value;
string sb=“发票#::”+
"1267" +
“
”+
“日期:”+
“2018年4月16日上午10:44:00”+
“
”+
“PO:”+
“
”+
“参考:”+
“
”+
“店员:”+
“A/A”;
var matches=Regex.Match(sb,
@“发票:\s*(*?)\s*
\s*日期:\s*(*?)\s*
\s*PO:\s*(*?)\s*
\s*参考:\s*(*?)\s*
\s*柜台人员:\s*(*?)\s*”;
如果(!matches.Success)
{
抛出新异常(“无法解析”);
}
var发票=匹配项。组[1]。值;
var date=matches.Groups[2]。值;
Dotnetfiddle此处:假设:
分隔:
using System;
using System.Collections.Specialized;
public class Program
{
public static void Main()
{
var str = @"Invoice #:
1267
<br>
Date:
4/16/2018 10:44:00 AM
<br>
PO #:
<br>
Reference:
<br>
Countermen:
A/A";
//Array containing "raw string data"
var raw = str.Split(new[]{"<br>"}, StringSplitOptions.RemoveEmptyEntries);
//Just using a simple NVC, opt for something else based on your needs
var kvp = new NameValueCollection();
//Go through the raw array we created earlier and
// add the key/value pairs to our NameValueCollection, kvp
Array.ForEach(raw, s =>
{
//Because of date/time, we'll restrict colon to first occurrence
var data = s.Split(new [] {":"}, 2, StringSplitOptions.None);
kvp.Add(data[0].Trim(), data[1].Trim());
});
/*
* At this point, we have our "parsed" data in
* key/value pairs, kvp and can use it as needed
*
*/
// We can loop through the kvp and simply display
foreach(string k in kvp.Keys){
Console.WriteLine("{0} = {1}", k, kvp[k]);
}
// We can assign values to variables we create
var invNum = kvp["Invoice #"];
}
}
文件:
Hth…我更想让每个组件都有自己的变量,比如
var invNum=1267;var月=4;var日=2018年
等等…@Xman-您可以根据需要扩展上面的内容<代码>var invNum=kvp[“发票#”]代码>我应该把它放在哪里?我还是新手,所以我真的不知道这些函数和方法是什么。对于这种情况,我需要一点帮助。@Xman我已经更新了答案并为函数添加了注释,还为NameValueCollection
添加了对Microsoft文档的引用(我随意选择使用的,它不是您可以使用的唯一数据结构-使用任何适合您需要的数据结构)。
Invoice # = 1267
Date = 4/16/2018 10:44:00 AM
PO # =
Reference =
Countermen = A/A