【问题标题】:How to find this using Regular Expression?如何使用正则表达式找到它?
【发布时间】:2009-03-23 15:28:31
【问题描述】:

我以为我理解 C# 正则表达式,但显然不是这样。我需要一些帮助来设计一个可以找到从 START|BEGIN 到 )) 的所有内容的表达式。表达式可以是多行的。

例如

START( FTP_STATE, XXX(
   VAL( FTP_INITIAL_STATE, 0 )
   VAL( FTP_INBOUND,       1 )
   AL( FTP_OUTBOUND,      2 )
))

/**************************************************************/

BEGIN( FTP_TIMER_MODE, YYY(
   VAL( FTP_REMOVE_TIMER,     0 )
   VAL( FTP_NOT_REMOVE_TIMER, 1 )
))

/**************************************************************/

非常感谢任何帮助

【问题讨论】:

  • 我建议使用 RegexBuddy 来处理正则表达式。它救了我很多次;)

标签: c# .net regex


【解决方案1】:

直截了当; START 或 BEGIN,然后是任意数量的任意符号,但非贪婪,最后是两个右括号。 .*?接受任意数量的任意符号,但尽可能少。要匹配多于一行,必须启用单行选项 (?s)(感谢 Alan M. 指出这一点。)

(?s)(START|BEGIN).*?\)\)

【讨论】:

    【解决方案2】:

    试试这个:

    (?:START|BEGIN)(?:[^)]+|\)[^)])+\)\)
    

    解释一下:

    • (?:START|BEGIN)   以STARTBEGIN 开头。
    • (?:[^)]+|\)[^)])+    在此之后,除) ([^)]+) 或) 之外的任何字符后跟) (\)[^)]) 之外的任何字符都可以跟随。 (因此无法将)) 与此表达式匹配。)
    • \)\)   最后是))

    我希望这会减少回溯。

    【讨论】:

      【解决方案3】:

      实际上您还需要考虑 VAL( ... )。

      在 perl 中是:

      (BEGIN|START)\([^(\)\)\))].+\)\)\)
      
      1. 以 BEGIN 或 START 开头
      2. 有一个左括号
      3. 允许介于两者之间的任何 NOT ))),以避免贪婪匹配
      4. 以三个右括号结束)))

      【讨论】:

      • 如果结尾 "))" 总是单独一行,则不会。无论如何,您的正则表达式不起作用。看起来您正在尝试使用字符类,就好像它是负前瞻一样。
      • 很好的调用 - 即使这个正则表达式将匹配给定的文本 - 至少在使用 preg_ 的快速 php 测试中,字符类什么都不做。
      【解决方案4】:
      @"(?s)(?:START|BEGIN).*?\)\)"
      

      其他一些人所说的“多行模式”实际上是单行(或 DOTALL)模式。这就是让点匹配换行符的模式。多行模式让 '^' 匹配行的开头 '$' 匹配行的结尾(通常,只匹配整个字符串的开头和结尾。我使用带有内联修饰符的 DOTALL 模式 "(?s )”。

      【讨论】:

      • 感谢您指出多行/单行的事情。选项的名称选择得很好;您可以同时启用单行和多行模式...:D
      【解决方案5】:

      如果你不明白,想学习,regexps 那么让我推荐这个regexp site

      解决方案可能类似于 /(START|BEGIN).*))/

      【讨论】:

        【解决方案6】:
        ResultString = Regex.Match(subject, @"(START|BEGIN).*?\)\)", RegexOptions.Singleline).Value;
        

        【讨论】:

        • 我觉得应该是MultiLine?
        • 嗯,也许你是对的,从 RegexBuddy 自动生成的代码,因为我使用的是 php 而不是 c#(虽然 regex 是正确的:D)
        【解决方案7】:

        试试这个

        MatchCollection m = Regex.Matches(input, "(START|BEGIN).+?\\)\\)", RegexOptions.Multiline);
        

        【讨论】:

          【解决方案8】:

          我不知道 C# 的语法,但在 Perl 中是这样的:

          m/(BEGIN|START).*?\)\)/s
          

          s 使它成为多行。

          你只需要看看如何在 C# 中制作正则表达式多行

          【讨论】:

          • 匹配到文件中的最后一个 )),而不是 BEGIN 或 START 之后的第一个 ))
          猜你喜欢
          • 1970-01-01
          • 2018-04-20
          • 2015-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          相关资源
          最近更新 更多