C#正则表达式删除行

C#正则表达式删除行,c#,regex,hl7,C#,Regex,Hl7,我需要在C#中应用正则表达式。 字符串如下所示: MSH|^~\&|OAZIS||C2M||20110310222404||ADT^A08|00226682|P|2.3||||||ASCII EVN|A08 PD1 PV1|1|test 我要做的是删除所有只包含3个字符的行(没有分隔符“|”)。因此,在这种情况下,必须删除“PD1”行(第3行)。 用正则表达式可以吗 Thx为什么不直接获取文件的句柄,生成一个临时输出文件,然后逐行运行呢。如果有一行包含3个字符,请跳过它。如果文件可以完

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

MSH|^~\&|OAZIS||C2M||20110310222404||ADT^A08|00226682|P|2.3||||||ASCII
EVN|A08
PD1
PV1|1|test
我要做的是删除所有只包含3个字符的行(没有分隔符“|”)。因此,在这种情况下,必须删除“PD1”行(第3行)。 用正则表达式可以吗


Thx

为什么不直接获取文件的句柄,生成一个临时输出文件,然后逐行运行呢。如果有一行包含3个字符,请跳过它。如果文件可以完全保存在内存中,那么可以使用GetLines()(我认为该方法就是这样调用的)来获取一个字符串数组,该数组逐行表示文件。

以下内容将在不使用正则表达式的情况下实现您所需的功能

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();

您将得到一个字符串[],其中包含文件中所有正确的行。)

此正则表达式将识别满足排除标准的行
^[^ |]{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.
  }
}

这三个角色总是一个人在一条线上吗?如果是这样,可以使用字符串开头/字符串结尾标记

下面是一个正则表达式,它匹配字符串上的三个字符:

\A.{3}\z
\A是字符串的开头。 \z是字符串的结尾。 . 是任何字符,{3}出现3次

这是:
(?
Regex与我使用的在线Regex测试仪中您想要的匹配,但是我认为
{4}
实际上应该是
{3}
,所以如果不适合您,请尝试切换它们

编辑:

这同样有效:
\n[^ |\n]{3}\n
,并且可能更接近您要查找的内容

编辑2:

括号中的数字肯定是
{3}
,在家里测试过。

^-行的开始。 \w字字符 {3} -重新处理3次 $-行尾

^\w{3}$

这只是我迄今为止看到的解决方案的一般观察结果。最初的问题包括“删除所有仅包含3个字符的行”[我的重点]。我不确定您的意思是否是“仅包含3个字符”,但如果您这样做了,您可能需要更改建议解决方案的逻辑,例如

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


例如,以防带有2个字符的行确实有效。(建议的正则表达式解决方案也是如此。)

这个问题有点模糊

如上所述,答案是这样的

(?:^ |)(?试试这个:

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

你可以用正则表达式来做

string output = Regex.Replace(input, "^[a-zA-Z0-9]{3}$", "");
[a-zA-Z0-9]将匹配任何字符或数字
{3}将匹配精确的3个数

对于这种工作,您可能应该使用类似的HL7解析器。使用
StringBuilder
而不是
string
不是更好吗?@Alex,无论何时在循环中构建字符串,您都应该使用
StringBuilder
而不是字符串串联。但是,这只是一个简单的例子来说明所涉及的逻辑。正则表达式解决方案更简单、更简洁。为什么你会提出相反的建议?@Josh,因为解决这个问题的方法不止一种。这段代码阅读起来非常简单。添加正则表达式会增加复杂性。我并不是说正则表达式不好。这不是唯一的方法@skaz,我认为在这种情况下使用正则表达式是过分的。但是,我真的不在乎。在我的代码中,任何一种方法都可以。见鬼,如果我当时有心情的话,我甚至可能使用过正则表达式。File.ReadAllLines这不处理一行有3个字符,其中一个是管道分隔符的情况。\w不包括管道。
string output = Regex.Replace(input, "^[a-zA-Z0-9]{3}$", "");