如何使用正则表达式找到它?

时间:2009-03-23 15:28:31

标签: c# .net regex

我以为我理解了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 )
))

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

任何帮助非常感谢

9 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:4)

试试这个:

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

解释一下:

  • (?:START|BEGIN) STARTBEGIN开始。
  • (?:[^)]+|\)[^)])+ 之后,除)[^)]+)或)之外的任何字符后跟除了除)之外的任何字符可能会跟随\)[^)])))。 (因此无法将\)\)与此表达式匹配。)
  • )) 最后是{{1}}。

我希望这会减少回溯。

答案 2 :(得分:1)

实际上你也需要考虑VAL(...)。

在perl中它将是:

(BEGIN|START)\([^(\)\)\))].+\)\)\)
  1. 从BEGIN或START
  2. 开始
  3. 有一个左括号
  4. 允许任何不)))),以避免贪婪的匹配
  5. 结束三个右括号)))

答案 3 :(得分:1)

@"(?s)(?:START|BEGIN).*?\)\)"

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

答案 4 :(得分:1)

你已经得到了答案,但我想我会投入this link,我认为这对于构建/测试表达式非常有用。您可以快速测试,然后在您满意时将表达式粘贴到代码中。

答案 5 :(得分:0)

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

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

s使其成为多行。

您只需要了解如何在C#

中制作正则表达式多行

答案 6 :(得分:0)

如果您不理解并想学习regexps,请让我推荐这个regexp site

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

答案 7 :(得分:0)

ResultString = Regex.Match(subject, @"(START|BEGIN).*?\)\)", RegexOptions.Singleline).Value;

答案 8 :(得分:0)

试试这个

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