簡體   English   中英

VB.net的RegEx

[英]RegEx for VB.net

我有一個包含內容的txt文件

$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文件,檢測是否存在“;” 和換行符並進行更改。

現在我有一個保存所有行的變量,還有其他方法,例如通過RegEx進行替換,無需循環遍歷每行即可進行更改,這樣我就可以輕松打印結果

並跟進問題,哪個更有效?

您可能可以使用\\w+;類的來找到所有匹配項\\w+; 但我不知道您將如何使用Regex.Replace替換添加'但保持原始匹配。

但是,如果您已經將其作為一個變量,則無需再次讀取文件,也可以使代碼全部找到;否則,無需執行任何操作; s,然后為每個找到前一個換行符,或者可以在換行符上使用String.Split將已經存在的變量拆分為幾行。 如果想將其返回到一個變量,則可以使用String.Join

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

嘗試

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

在您的多行字符串上。

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

它比您現在一步一步地遍歷字符串要有效,但是如果您有疑問,則必須對其進行概要分析。

我會說是的! 這可以使用正則表達式來完成。 確保您已啟用“多行”選項,並使用一些捕獲組來制作正則表達式以簡化工作。

但是我可以說這不是最佳選擇。 由於您提到了可能要處理的行數,因此使用流方法而不是內存中方法似乎在“資源上明智”的做法更明智。

采用Regex方法(這花了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);            
    }

希望這可以幫助,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM