[英]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.