我以为我理解了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 )
))
/**************************************************************/
任何帮助非常感谢
答案 0 :(得分:10)
直截了当; START或BEGIN,然后任意数量的任何符号,但不贪婪和最后两个右括号。 。*?取任意数量的任何符号,但尽可能少。为了匹配超过一行,必须启用单行选项(?s)(感谢Alan M.指出这一点。)
(?s)(START|BEGIN).*?\)\)
答案 1 :(得分:4)
试试这个:
(?:START|BEGIN)(?:[^)]+|\)[^)])+\)\)
解释一下:
(?:START|BEGIN)
从START
或BEGIN
开始。(?:[^)]+|\)[^)])+
之后,除)
([^)]+
)或)
之外的任何字符后跟除了除)
之外的任何字符可能会跟随\)[^)]
())
)。 (因此无法将\)\)
与此表达式匹配。)))
最后是{{1}}。我希望这会减少回溯。
答案 2 :(得分:1)
实际上你也需要考虑VAL(...)。
在perl中它将是:
(BEGIN|START)\([^(\)\)\))].+\)\)\)
答案 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);