0

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

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

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

谢谢

4

10 回答 10

1

这: (?<![|])[^\n]{4}\n 正则表达式匹配您在我使用的在线正则表达式测试器中想要的内容,但是我相信{4}实际应该是 a {3},所以如果它不适合您,请尝试切换它们。

编辑:

这也有效:\n[^|\n]{3}\n并且可能更接近您正在寻找的内容。

编辑2:

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

于 2011-03-10T22:21:42.063 回答
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[] ,其中包含文件中所有正确的行。)

于 2011-03-10T22:17:37.557 回答
0

^ - 行首。\w - 单词字符 {3} - 精确重复 3 次 $ - 行尾

^\w{3}$
于 2011-03-10T22:23:24.127 回答
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.
  }
}
于 2011-03-10T22:18:57.643 回答
0

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

这是一个匹配字符串中的三个字符的正则表达式:

\A.{3}\z

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

于 2011-03-10T22:20:35.707 回答
0

这个问题有点模糊。

如前所述,答案是这样的

(?:^|(?<=\n))[^\n|]{3}(?:\n|$)这允许匹配中的空格。
所以"#\t)"也会被删除。

要将字符限制为可视字符(非空白),您可以使用
(?:^|(?<=\n))[^\s|]{3}(?:\n|$)
which doesent allow whitespace。

对于这两个上下文都是单个字符串,替换是 '' 和全局的。
perl 中的示例上下文:s/(?:^|(?<=\n))[^\n|]{3}(?:\n|$)//g

于 2011-03-11T00:12:03.740 回答
0

尝试这个:

text = System.Text.RegularExpressions.Regex.Replace(
        text, 
        @"^[^|]{3}(?:\r\n|[\r\n]|$)", 
        "", 
        System.Text.RegularExpressions.RegexOptions.Multiline);
于 2012-03-15T21:43:59.563 回答
0

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

于 2011-03-10T22:16:24.657 回答
0

到目前为止,我看到的解决方案只是一个一般性的观察。最初的问题包括评论“删除所有包含 3 个字符的行”[我的重点]。我不确定你的意思是不是字面上的“只有 3 个字符”,但如果你这样做了,你可能想改变提议的解决方案的逻辑,比如

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

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

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

于 2011-03-10T22:46:09.387 回答
0

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

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

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

于 2016-05-22T17:21:19.363 回答