我需要在 C# 中应用正则表达式。字符串如下所示:
MSH|^~\&|OAZIS||C2M||20110310222404||ADT^A08|00226682|P|2.3||||||ASCII
EVN|A08
PD1
PV1|1|test
我想要做的是删除所有只包含 3 个字符的行(没有分隔符'|')。所以在这种情况下,必须删除“PD1”行(第 3 行)。这可以用正则表达式吗?
谢谢
这:
(?<![|])[^\n]{4}\n
正则表达式匹配您在我使用的在线正则表达式测试器中想要的内容,但是我相信{4}
实际应该是 a {3}
,所以如果它不适合您,请尝试切换它们。
编辑:
这也有效:\n[^|\n]{3}\n
并且可能更接近您正在寻找的内容。
编辑2:
数字是括号是肯定的{3}
,在家里测试过。
以下将在没有正则表达式的情况下执行您想要的操作。
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[] ,其中包含文件中所有正确的行。)
^ - 行首。\w - 单词字符 {3} - 精确重复 3 次 $ - 行尾
^\w{3}$
此正则表达式将识别符合您的排除标准的行,^[^|]{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 次
这个问题有点模糊。
如前所述,答案是这样的
(?:^|(?<=\n))[^\n|]{3}(?:\n|$)
这允许匹配中的空格。
所以"#\t)"
也会被删除。
要将字符限制为可视字符(非空白),您可以使用
(?:^|(?<=\n))[^\s|]{3}(?:\n|$)
which doesent allow whitespace。
对于这两个上下文都是单个字符串,替换是 '' 和全局的。
perl 中的示例上下文:s/(?:^|(?<=\n))[^\n|]{3}(?:\n|$)//g
尝试这个:
text = System.Text.RegularExpressions.Regex.Replace(
text,
@"^[^|]{3}(?:\r\n|[\r\n]|$)",
"",
System.Text.RegularExpressions.RegexOptions.Multiline);
为什么不只是获取文件的句柄,制作一个临时输出文件,然后逐行运行。如果有一行包含 3 个字符,则跳过它。如果文件可以完全保存在内存中,则可以使用 GetLines() (我认为这就是该方法所调用的方法)来获取逐行表示文件的字符串数组。
到目前为止,我看到的解决方案只是一个一般性的观察。最初的问题包括评论“删除所有仅包含 3 个字符的行”[我的重点]。我不确定你的意思是不是字面上的“只有 3 个字符”,但如果你这样做了,你可能想改变提议的解决方案的逻辑,比如
if (line.Trim().Length > 3 ...)
至
if (line.Trim().Length != 3 ...)
...以防万一有 2 个字符的行确实有效,例如。(建议的正则表达式解决方案的想法相同。)
你可以使用正则表达式来做到这一点
string output = Regex.Replace(input, "^[a-zA-Z0-9]{3}$", "");
[a-zA-Z0-9] 将匹配任何字符或数字 {3} 将匹配 3 的确切数字