C#正则表达式删除行
我需要在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个字符,请跳过它。如果文件可以完
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}$", "");