2010-11-29 54 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);    
    } 

希望这有助于