【问题标题】:RegEx for VB.netVB.net 的正则表达式
【发布时间】:2010-11-29 11:16:00
【问题描述】:

我有一个包含内容的 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 替换来进行更改,而无需遍历每一行,这样我可以轻松打印结果

还有后续的问题,哪个效率更高?

【问题讨论】:

  • 在您的示例中,字母、数字和下划线似乎是您要更新的字符串的有效字符。这是正确的,还是还有其他字符?
  • #、+、-、[、] 是可以在换行符和“;”之间的任何位置找到的字符字符

标签: regex vb.net text-processing


【解决方案1】:

试试

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

在你的多行字符串上。

这将在一行的开头找到任何字符串(长度为一个或多个),直到第一个分号(如果有),并将其替换为引用的等效项。

它应该比你现在做的那样逐行循环字符串更有效,但如果你有疑问,你必须对其进行分析。

【讨论】:

    【解决方案2】:

    您可能可以使用 \w+; 之类的内容找到所有匹配项,但我不知道您如何使用 Regex.Replace 添加 's 来替换它,但保留原始匹配项.

    但是,如果您已经将它作为一个变量,则不必再次读取文件,您可以让您的代码找到所有 ;s,然后为每个变量找到前一个换行符,或者您可以使用换行符上的String.Split 将您已经进入的变量拆分为行。 如果你想把它恢复到一个变量,你可以使用String.Join

    我个人通常会使用String.Split(如果需要也可能使用String.Join)方法,因为我认为这会使代码易于阅读。

    【讨论】:

      【解决方案3】:

      我会说是的!这可以通过正则表达式来完成。确保您打开了“多行”选项,并使用一些捕获组来制作您的正则表达式以简化工作。

      但是,我可以说这不是最佳选择。由于您提到了您可以处理的行数,因此使用流式方法而不是内存方法似乎更“资源明智”。

      采用正则表达式方法(这需要 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);            
          }
      

      希望这会有所帮助,

      【讨论】:

        猜你喜欢
        • 2010-12-24
        • 1970-01-01
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多