2011-03-29 24 views
1

我有一个很大的描述字符串(1000s)的X12 EDI文件。这些描述字符串可以在具有*的相同分隔符的其他字符串之前,之后和之间找到。正则表达式,C#

所有描述字符串开始与标签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#

这是我到目前为止所。 (**)(。{0,}?)(**)(。{0,}?)(**)〜

+0

取代什么? – 2011-03-29 03:13:18

回答

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 **”的结尾,我不记得究竟是如何加入()处理它。无论如何,这应该做到这一点。

+0

问题是,如果您在我的示例中看到,在REF * TC **之后还有其他行可能发生,无法修改。例如:〜DTM * 010 * 20110329〜需要单独保留。尽管感谢您的快速回复。 – 2011-03-29 03:33:51

+0

说明字符串实际上是与文件内的其他字符串混合在一起的,所以仅仅通过REF * TC **分割字符串会将太多数据带入它创建的字符串数组中。 – 2011-03-29 03:38:11

+0

我明白了 - 我不明白从这个例子 - 也许我没有仔细阅读这个问题。 – Zannjaminderson 2011-03-29 05:52:55

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

这只是根据您提供什么,而不是100%肯定你会什么虽然,说实话。

+0

它不是纯粹的正则表达式,组合的正则表达式和.Net .Replace,但它的工作原理。任何关于如何使用纯正则表达式的想法? – 2011-03-29 04:20:43

+0

@Jason:你*可能会使用负面的先行和量词来取消其他'*'的资格,但我对此表示怀疑。我认为你必须这样做。这就是'.Replace'方法存在的原因。 – 2011-03-29 04:24:58

+0

是的,我正在用同样的方式走下前面的负面看法,哦,好吧。感谢您及时的回复。我有一个预制的应用程序,只需要巨大的字符串,并且迭代正则表达式可以找到并替换。希望不必重新编码应用程序,但会做到这一点,并包括你的逻辑。谢谢。 – 2011-03-29 04:28:15