当前位置:编程学习 > C#/ASP.NET >>

盼正则表达式高手解答。

我有很多的.txt文件,数据格式如下:

ORIGINAL DATA LOGGER SYSTEM  
10-10-21 21:12:29 Flow  39.5873 m3/h Vel:  1.40011 m/s NET:  0x   m3 
POS:  0x   m3 NEG:  0x   m3 EFR: 5.71617  GJ/h E.T:  0  GJ Tin: 57.7539  Tout: 22.3503  T.D.: 0.08799  
P.D.: 35.4030
10-10-21 21:12:31 Flow  41.0425 m3/h Vel:  1.45158 m/s NET:  0x   m3 
POS:  0x   m3 NEG:  0x   m3 EFR: 5.92457  GJ/h E.T:  0  GJ Tin: 57.7572  Tout: 22.3535  T.D.: 0.08799  
P.D.: 35.4040
10-10-21 21:12:33 Flow  47.0231 m3/h Vel:  1.6631 m/s NET:  0x   m3 
POS:  0x   m3 NEG:  0x   m3 EFR: 6.7855  GJ/h E.T:  0  GJ Tin: 57.7409  Tout: 22.3568  T.D.: 0.08799  
P.D.: 35.3840
10-10-21 21:12:35 Flow  50.3259 m3/h Vel:  1.77991 m/s NET:  0x   m3 
POS:  0x   m3 NEG:  0x   m3 EFR: 7.27417  GJ/h E.T:  0  GJ Tin: 57.7051  Tout: 22.3991  T.D.: 0.08799  
P.D.: 35.3060

位于两个时间段之间的数据为一条完整的数据。
在单个文件中,如果某个量存在,如Flow,则这个量在单个文件中的每条数据中都会存在。
但是另一个.txt中,如果缺少Vel量,则这个文本文件中都不会有这个量的存在。

现在假设每个文本文件中所有的量都存在。不存在的量就取空字符串。

请问,我现在想获取文本文件中所有的
Flow(介于Flow和m3/h之间的数值)
Vel(介于Vel和m/s之间的数值)
NET
POS
NEG
EFR
E.T
Tin
Tout
T.D.
P.D.
对应的值,请问正则该如何写?
我打算将每一个量用一个对应的List<string>包装起来。如
List<string> Flow(包装所有Flow量的值) --------------------编程问答-------------------- 这个可以的。用C#里面的Split函数 分割换行符即可。
思路:
用'|'替换'\r\n'(回车换行)
然后Split
最后怎么做,你懂的。 --------------------编程问答-------------------- upupupupup --------------------编程问答-------------------- up...正则盲。。 --------------------编程问答-------------------- 这个可以写 
这个真不想写 --------------------编程问答-------------------- try...


            Regex reg = new Regex(@"(?is)Flow\s*(?<Flow>\S+)\s*m3/h\s+Vel:\s*(?<Vel>\S+)\s*m/s\s*NET:\s*(?<NET>\S+)\s*m3\s*POS:\s*(?<POS>\S+)\s*m3\s*NEG:\s*(?<NEG>\S+)\s*m3\s*EFR:\s*(?<EFR>\S+)\s*GJ/h\s*E\.T:\s*(?<ET>\S+)\s*GJ\s*Tin:\s*(?<Tin>\S+)\s*Tout:\s*(?<Tout>\S+)\s*T\.D\.:\s*(?<TD>\S+)\s*P\.D\.:\s*(?<PD>\S+)");
            MatchCollection mc = reg.Matches(yourStr);
            foreach (Match m in mc)
            {
                richTextBox2.Text += m.Groups["Flow"].Value + "\n";
                richTextBox2.Text += m.Groups["Vel"].Value + "\n";
                richTextBox2.Text += m.Groups["NET"].Value + "\n";
                richTextBox2.Text += m.Groups["POS"].Value + "\n";
                richTextBox2.Text += m.Groups["NEG"].Value + "\n";
                richTextBox2.Text += m.Groups["EFR"].Value + "\n";
                richTextBox2.Text += m.Groups["ET"].Value + "\n";
                richTextBox2.Text += m.Groups["Tin"].Value + "\n";
                richTextBox2.Text += m.Groups["Tout"].Value + "\n";
                richTextBox2.Text += m.Groups["TD"].Value + "\n";
                richTextBox2.Text += m.Groups["PD"].Value + "\n-------------------------\n";
            }
--------------------编程问答--------------------
引用 5 楼 lxcnn 的回复:
try...



C# code
            Regex reg = new Regex(@"(?is)Flow\s*(?<Flow>\S+)\s*m3/h\s+Vel:\s*(?<Vel>\S+)\s*m/s\s*NET:\s*(?<NET>\S+)\s*m3\s*POS:\s*(?<POS>\S+)\s*m3\s*NEG:\s*(?<NEG>\S+)\s*m3\s*EF……
` --------------------编程问答-------------------- 非常lxcnn给予的无私帮助。
我仔细测试了您给的代码。
发现所有的这十一个变量都存在的时候是可以正确读取所有数据的。非常好用。
可能是因为我前面的表述不够清楚,这十一个变量中的任意多个都有可能不出现。
如有一个.txt,可能只有Flow Vel NET POS这4个变量,但另一个.txt可能会有
NET POS NEG EFR E.T这几个变量。也还有可能一个.txt中出现所有变量。
下面是一个测试数据。请用记事本打开。不要用IE。

http://222.76.219.50/有td数据.txt
http://222.76.219.50/没有td数据.txt

再次感谢您给予的帮助。 --------------------编程问答-------------------- 我这里除了CSDN等几个网站外,其它网站打不开
前面的时间肯定存在是吧

            Regex reg = new Regex(@"(?is)\d{2}:\d{2}:\d{2}\s*(Flow\s*(?<Flow>\S+)\s*m3/h)?(\s*Vel:\s*(?<Vel>\S+)\s*m/s)?(\s*NET:\s*(?<NET>\S+)\s*m3)?(\s*POS:\s*(?<POS>\S+)\s*m3)?(\s*NEG:\s*(?<NEG>\S+)\s*m3)?(\s*EFR:\s*(?<EFR>\S+)\s*GJ/h)?(\s*E\.T:\s*(?<ET>\S+)\s*GJ)?(\s*Tin:\s*(?<Tin>\S+))?(\s*Tout:\s*(?<Tout>\S+))?(\s*T\.D\.:\s*(?<TD>\S+))?(\s*P\.D\.:\s*(?<PD>\S+))?");
            MatchCollection mc = reg.Matches(yourStr);
            foreach (Match m in mc)
            {
                richTextBox2.Text += m.Groups["Flow"].Value + "\n";
                richTextBox2.Text += m.Groups["Vel"].Value + "\n";
                richTextBox2.Text += m.Groups["NET"].Value + "\n";
                richTextBox2.Text += m.Groups["POS"].Value + "\n";
                richTextBox2.Text += m.Groups["NEG"].Value + "\n";
                richTextBox2.Text += m.Groups["EFR"].Value + "\n";
                richTextBox2.Text += m.Groups["ET"].Value + "\n";
                richTextBox2.Text += m.Groups["Tin"].Value + "\n";
                richTextBox2.Text += m.Groups["Tout"].Value + "\n";
                richTextBox2.Text += m.Groups["TD"].Value + "\n";
                richTextBox2.Text += m.Groups["PD"].Value + "\n-------------------------\n";
            }
--------------------编程问答-------------------- to:非常好用。多谢。
可惜我太急了,居然忘了我还需要提取出前面的日期和时间值。
看来,还需要麻烦您一次了。多谢。 --------------------编程问答--------------------
帮顶. --------------------编程问答--------------------
引用 9 楼 heywap 的回复:
to:非常好用。多谢。
可惜我太急了,居然忘了我还需要提取出前面的日期和时间值。
看来,还需要麻烦您一次了。多谢。


try...

            Regex reg = new Regex(@"(?is)(?<date>\d{2}-\d{2}-\d{2})\s*(?<time>\d{2}:\d{2}:\d{2})\s*(Flow\s*(?<Flow>\S+)\s*m3/h)?(\s*Vel:\s*(?<Vel>\S+)\s*m/s)?(\s*NET:\s*(?<NET>\S+)\s*m3)?(\s*POS:\s*(?<POS>\S+)\s*m3)?(\s*NEG:\s*(?<NEG>\S+)\s*m3)?(\s*EFR:\s*(?<EFR>\S+)\s*GJ/h)?(\s*E\.T:\s*(?<ET>\S+)\s*GJ)?(\s*Tin:\s*(?<Tin>\S+))?(\s*Tout:\s*(?<Tout>\S+))?(\s*T\.D\.:\s*(?<TD>\S+))?(\s*P\.D\.:\s*(?<PD>\S+))?");
            MatchCollection mc = reg.Matches(yourStr);
            foreach (Match m in mc)
            {
                richTextBox2.Text += m.Groups["date"].Value + "\n";
                richTextBox2.Text += m.Groups["time"].Value + "\n";
                richTextBox2.Text += m.Groups["Flow"].Value + "\n";
                richTextBox2.Text += m.Groups["Vel"].Value + "\n";
                richTextBox2.Text += m.Groups["NET"].Value + "\n";
                richTextBox2.Text += m.Groups["POS"].Value + "\n";
                richTextBox2.Text += m.Groups["NEG"].Value + "\n";
                richTextBox2.Text += m.Groups["EFR"].Value + "\n";
                richTextBox2.Text += m.Groups["ET"].Value + "\n";
                richTextBox2.Text += m.Groups["Tin"].Value + "\n";
                richTextBox2.Text += m.Groups["Tout"].Value + "\n";
                richTextBox2.Text += m.Groups["TD"].Value + "\n";
                richTextBox2.Text += m.Groups["PD"].Value + "\n-------------------------\n";
            }
--------------------编程问答--------------------
引用 11 楼 lxcnn 的回复:
引用 9 楼 heywap 的回复:
to:非常好用。多谢。
可惜我太急了,居然忘了我还需要提取出前面的日期和时间值。
看来,还需要麻烦您一次了。多谢。


try...


C# code
            Regex reg = new Regex(@"(?is)(?<date>\d{2}-\d{2}-\d{2})\s*(?<time>\d{2}:\d{2}:\d{2……
过客真牛!
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,