我有一个包含许多描述字符串(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,}?)(**)〜
答案 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()究竟是如何处理它的。无论如何,应该这样做。