2010-11-29 55 views
1

我有內容的txt文件正則表達式VB.net

$NETS 
P3V3_AUX_LGATE; PQ6.8 PU37.2 
U335_PIN1; R3328.1 U335.1 
$END 

需要以這種格式進行更新,並返回保存到另一個txt文件

$NETS 
'P3V3_AUX_LGATE'; PQ6.8 PU37.2 
'U335_PIN1'; R3328.1 U335.1 
$END 

注:號線可能高達10,000行

我目前的解決方案是逐行讀取txt文件,檢測是否存在「;」和換行符並進行更改。

現在我有保存所有行的變量,有沒有別的辦法像通過正則表達式做更改,而不循環直通每一行更換,這樣我可以很容易地打印結果

和跟進問題,哪一個更有效率?

+0

在你的例子中,字母,數字和下劃線看起來是你待更新字符串的有效字符。這是正確的,還是可能還有其他角色? – 2010-11-29 12:06:36

+1

#,+, - ,[,]是可以在換行符和「;」之間的任何位置找到的字符。字符 – Aries 2010-11-30 06:00:19

回答

0

嘗試

ResultString = Regex.Replace(SubjectString, "^([^;\r\n]+);", "'$1';", RegexOptions.Multiline) 

您多行字符串。

這將在一行的開始處找到任何字符串(長度爲一個或多個),直到第一個分號(如果有一個)並將其替換爲其引用的等效值。

它應該比現在正在循環逐行掃描字符串更有效,但如果您有疑問,則必須對其進行配置。

+0

謝謝Tim,會試試這個並反饋結果 – Aries 2010-11-30 05:39:55

0

你或許可以找到所有匹配使用類似\w+;但我不知道如何能夠做一個替換使用Regex.Replace添加' s,但保持原來的匹配。但是,如果你已經把它作爲一個變量,你不必再次閱讀文件,要麼你可以讓你的代碼找到所有的; s,然後找到每個的前一個換行符,或者你可以使用String.Split在新行上將你已經進入的行變量分開。 如果你想讓它回到一個變量,你可以使用String.Join

就我個人而言,我通常會使用String.Split(如果需要的話可能需要String.Join)方法,因爲我認爲這會使代碼易於閱讀。

+0

我會先嚐試RegEx解決方案,謝謝ho1 – Aries 2010-11-30 05:41:02

0

我會說是的!這可以通過正則表達式來完成。確保你打開了「多行」選項,並使用一些捕獲組來製作正則表達式以減輕工作負擔。

但我可以說這不會是最理想的。既然你提到了你可以處理的行數,那麼使用流式方法而不是內存方式似乎更智能化。

以正則表達式的方法(這花了15分鐘,所以請不要認爲這是最佳的解決方案,就證明這是可行的)

private static Regex matcher = new Regex(@"^\$NETS\r\n(?<entrytitle>.[^;]*);\s*(?<entryrest>.*)\r\n(?<entrytitle2>.[^;]*);\s*(?<entryrest2>.*)\r\n\$END\r\n", RegexOptions.Compiled | RegexOptions.Multiline); 
    static void Main(string[] args) 
    { 
     string newString = matcher.Replace(ExampleFileContent, new MatchEvaluator(evaluator)); 
    } 

    static string evaluator(Match m) 
    { 
     return String.Format("$NETS\r\n'{0}'; {1}\r\n'{2}'; {3}\r\n$END\r\n", 
           m.Groups["entrytitle"].Value, 
           m.Groups["entryrest"].Value, 
           m.Groups["entrytitle2"].Value, 
           m.Groups["entryrest2"].Value);    
    } 

希望這有助於