2011-03-10 82 views
0

我需要在C#中应用正则表达式。 字符串如下所示:C#正则表达式删除行

MSH|^~\&|OAZIS||C2M||20110310222404||ADT^A08|00226682|P|2.3||||||ASCII 
EVN|A08 
PD1 
PV1|1|test 

而我想做的事就是删除所有只包含3个字符(不带分隔符“|”)的行。所以在这种情况下,'PD1'行(第3行)必须被删除。 这是可能的正则表达式?

THX

+5

您可能应该使用像这样的[NHapi](http://nhapi.sourceforge.net/home.php)的HL7解析器o f工作。 – 2011-03-10 22:16:04

回答

0

为什么不只是得到一个处理的文件,做一个临时的输出文件,并通过线运行一个接一个。如果有一个包含3个字符的行,请跳过它。如果文件可以完全保存在内存中,那么可以使用GetLines()(我认为这就是所谓的方法)来获取一行一行代表文件的字符串数组。

+0

File.ReadAllLines http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx – 2011-03-10 22:36:04

1

以下将做你想要的东西没有正则表达式。

String inputString; 
String resultingString = ""; 
for(var line in inputString.Split(new String[]{"\n"})) { 
    if (line.Trim().Length > 3 || line.Contains("|")) 
     resultingString += line + "\n"; 
} 

这假定你有你的文件作为一个大字符串。它会为您提供另一个字符串,并删除必要的行。

(或者你可以直接将文件做:

string[] goodLines = 
    // read all of the lines of the file 
    File.ReadLines("fileLocation"). 
     // filter out the ones you want 
     Where(line => line.Trim().Length > 3 || line.Contains("|")).ToArray(); 

你有一个String []与所有在你的文件的正确行结束)

+0

在这里使用StringBuilder而不是'string'会更好吗? – Alex 2011-03-10 22:19:27

+1

@Alex,无论何时您在循环中构建字符串,都应该使用'StringBuilder'而不是字符串连接。但是,这只是一个简单的例子来说明所涉及的逻辑。 – jjnguy 2011-03-10 22:20:49

+0

正则表达式解决方案更简单,更简洁。你为什么会另外提出建议? – 2011-03-10 22:36:28

0

此正则表达式将确定符合排除标准^[^|]{3}$的行,那么它只是遍历所有行(包含数据)并检查哪些符合排除标准。像这样。

foreach(Match match in Regex.Matches(data, @"^.+$") 
{ 
    if (!Regex.IsMatch(match.Value, @"^[^|]{3}$")) 
    { 
    // Do Something with legitamate match.value like write line to target file. 
    } 
} 
0

这三个角色总是会自己在一条线上吗?如果是这样,你可以使用字符串/字符串标记的结束的开始。

这里的匹配三个大字是由自己在字符串中的正则表达式:

\A.{3}\z 

\ A是字符串的开始。 \ z是字符串的结尾。 。是任意字符,{3}有3次出现

1

此: (?<![|])[^\n]{4}\n 正则表达式匹配你在我使用的在线正则表达式测试仪想要的东西,但是我相信{4}实际上应该是一个{3},所以尽量如果切换它们不适合你。

编辑:

这也适用于:\n[^|\n]{3}\n并可能是更接近你在找什么。

编辑2:

数为括号肯定是{3},测试它在家里。

0

^- 行首。 \ W - 单词字符 {3} - repreated准确3倍 $ - 线

^\w{3}$ 
+0

这不处理一行有3个字符,其中一个是管道分隔符的情况。 – James 2011-03-10 22:43:11

+0

\ w不包括管道。 – Paul 2011-03-11 03:35:49

0

从我到目前为止看到张贴的解决方案,只是一般的观察结束。原始问题包括评论“删除只有包含3个字符的所有行”[我的重点]。我不知道,如果你的意思字面意思是“只有3个字符”,但如果你没有,你可能想改变的东西提出的解决方案的逻辑就像

if (line.Trim().Length > 3 ...) 

if (line.Trim().Length != 3 ...) 

例如,以防万一带2个字符的行确实有效。 (提出的正则表达式解决方案的想法相同。)

0

这个问题有点含糊。

如前所述,得到的答案是这样的

(?:^|(?<=\n))[^\n|]{3}(?:\n|$)这使得空格将比分扳平。
所以"#\t)"也将被删除。

要限制字符可视(非空格),你可以使用
(?:^|(?<=\n))[^\s|]{3}(?:\n|$)
这doesent允许空白。

对于上下文都是单个字符串,替换为''和全局。在Perl
实例背景:s/(?:^|(?<=\n))[^\n|]{3}(?:\n|$)//g

0

试试这个:

text = System.Text.RegularExpressions.Regex.Replace(
     text, 
     @"^[^|]{3}(?:\r\n|[\r\n]|$)", 
     "", 
     System.Text.RegularExpressions.RegexOptions.Multiline); 
0

你可以做到这一点使用正则表达式

string output = Regex.Replace(input, "^[a-zA-Z0-9]{3}$", ""); 

[A-ZA-Z0-9]将匹配任何字符或数字 {3}将匹配3的确切数字