正则表达式,C#

时间:2011-03-29 03:08:33

标签: c# regex

我有一个包含许多描述字符串(1000s)的大型X12 EDI文件。这些描述字符串可以在具有相同分隔符*。

的其他字符串之前,之后和之间找到

所有描述字符串都以标记REF * TC **开头,以字符〜

结尾

我需要找到并替换这两个标签之间发生的所有*,而不触及其他字符串,在此示例中为DTM字符串。

我包含了两个描述字符串的示例,因为它们可以在文件中找到。如您所见,第一个描述字符串包含我需要替换的*,第二个描述字符串不包含任何需要替换的*。

~REF*TC**BLAH*BLAH*~REF*TC**BLAHBLAH~REF*TC***BLAH~DTM*010*20110329~

期望的输出:

~REF*TC**BLAHBLAH~REF*TC**BLAHBLAH~REF*TC**BLAH~DTM*010*20110329~

我正在使用C#

这是我到目前为止所做的。

查找表达式:REF * TC **(。{0,}?)(* +)(。{0,}?)(**)(。{0,}?)(**)〜

2 个答案:

答案 0 :(得分:4)

以下是我的想法:

var str = "~REF*TC**BLAH*BLAH*~REF*TC**BLAHBLAH~REF*TC***BLAH~DTM*010*20110329~";
var result = (new Regex(@"(?<pre>REF\*TC\*\*)(?<text>.*?)(?<post>~)")).Replace(str,(m) =>
{
    return String.Join(String.Empty,new String[]{
        m.Groups["pre"].Value,
        m.Groups["text"].Value.Replace("*",String.Empty),
        m.Groups["post"].Value
    });
});

<强> DEMO

这只是基于你提供的内容,而不是百分之百确定你的目标是什么,说实话。

答案 1 :(得分:1)

正则表达式很棒,但正如着名的引语所示,Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.跳过正则表达式并只使用字符串方法。你可以像在REF*TC**开始标记上拆分它然后替换所有*字符一样简单,或者你可以尝试更复杂的东西。当简单的字符串方法可以做时,不要一直使用正则表达式。

编辑:

这是一个非常简单的例子:

string[] lines = file.Split("REF*TC**");
for(int i=0;i<lines.Length;i++)
{
    lines[i] = lines[i].Replace("*", "");
}
string output = string.Join("REF*TC**", lines);

你可能必须在最后清理一个额外的“REF * TC **”,我不记得Join()究竟是如何处理它的。无论如何,应该这样做。