2011-03-29 68 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