Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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
Regex C#用于~分隔文本文件_C#_Regex - Fatal编程技术网

Regex C#用于~分隔文本文件

Regex C#用于~分隔文本文件,c#,regex,C#,Regex,我正在尝试匹配以下~分隔文本文件中的190 GPSE~21~ADVANCED PAVING~P.O. BOX 12847~Ogden~UT~84201~190~12/5/2008~OVER 60~2/3/2009~112458~12/5/2008~12/5/2008~5176~WESTERN GAS PROCESSOR, GRANGER~MOUNTAIN GAS PLANT~GRANGER~WY~82934~7533~TESORO REFINING~474 WEST 900 NORTH~SALT

我正在尝试匹配以下~分隔文本文件中的190

GPSE~21~ADVANCED PAVING~P.O. BOX 12847~Ogden~UT~84201~190~12/5/2008~OVER 60~2/3/2009~112458~12/5/2008~12/5/2008~5176~WESTERN GAS PROCESSOR, GRANGER~MOUNTAIN GAS PLANT~GRANGER~WY~82934~7533~TESORO REFINING~474 WEST 900 NORTH~SALT LAKE CITY~UT~841031494~BUT~Freight~5000~0.0577~288.5~360.63
GPSE~21~ADVANCED PAVING~P.O. BOX 12847~Ogden~UT~84201~190~12/5/2008~OVER 60~2/3/2009~~12/5/2008~12/5/2008~~~~~~~~~~~~~~FUEL SURCHARGE~288.5~0.25~72.13~360.63
基本上有两条线,编号为190。我想用正则表达式来匹配“190”。我是新加入regex的,我不知道我怎么能做到这一点。有谁能帮我创建一个正则表达式来匹配这两行中的“190”吗。谢谢。

在~符号之间匹配“190”的正则表达式应该是:

/~190~/
如果要匹配~分隔文件中的第八个字段,请在~上拆分,然后使用第八个字段。例如,在Perl中:

my @fields = split /~/, $string;
my $wanted = $fields[7];

您的问题对于您实际要做的事情是相当模糊的。

编辑:Ops!现在我意识到你想要C#中的正则表达式。在这种情况下,请忽略此消息

一个带有“Perl”正则表达式的解决方案。它匹配除“~”后跟“~”之外的任何字符。这个过程有七次。在此之后,它将选择所有字符,直到找到第一个“~”(这将是文件的第八个字段)。括号将该内容保存在变量“$1”中

/(?:[^~]*~){7}([^~]*)/
测试

script.pl的内容

结果:

190
190

因为基本上只需要获取第8个字段,所以根本不需要正则表达式

这个小片段应该可以做到这一点(很好地包装在一个易于使用的方法中-我甚至为您做了错误处理部分):

公共字符串GetInvoiceNumber(字符串行)
{
如果(行==null)
{
抛出新的ArgumentNullException(“行”);
}
var res=line.Split(“~”);
如果(分辨率长度<8)
{
抛出新ArgumentException(“给定的文本行不包含发票号!”,“行”);
}
返回res[7];
}

我想在两行中匹配190。190实际上是一个发票编号值。它可以在每一行中改变,就像它可以是一个字符串值,比如“EA123”或193或186,或者是一些类似于smiliar的东西。所以基本上就像你说的,我需要修改第8个字段。谢谢,但是/(?:[^~]*~{7}([^~]*])/返回了多个匹配的单词。删除
/
s,你可以在C#中使用它。这是很长一段时间完成的。。无论如何,谢谢你。。我不知道如何关闭这个。你只需点击特定帖子左边的勾号图标,将其中一个答案标记为正确即可。考虑到回答问题和回答问题之间的区别,其他答案都很可怕,所以我无论如何都会发布这篇文章;)
perl script.pl
190
190
public string GetInvoiceNumber(string line)
{
    if(line == null)
    {
        throw new ArgumentNullException("line");
    }

    var res = line.Split('~');

    if(res.Length < 8)
    {
        throw new ArgumentException("The given line of text does not contain an invoice number!", "line");
    }

    return res[7];
}