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