我有一个简单的场景似乎在困扰我。我想在两个没有注释掉的标签之间获取文本。这是一个例子:
// Example of commented text
// :Start
// <I don't want to get this text>
// :End
:Start
<Here is the text i want>
:End
解决方案:
感谢大家的帮助。超快速地收到答案,完全符合我的需要。我选择了以下正则表达式,因为它最适合我的情况。特别感谢Tim Pietzcker:
(?sm)(?<=^:Start\s*)(?:(?!^:End).)*
答案 0 :(得分:2)
试试这个:
(?sm)(?<=^:Start\s*)(?:(?!^:End).)*
<强>解释强>
(?sm) # Set options: . matches newline, ^ matches start-of line
(?<= # Assert that this regex can be matched before the current position:
^ # Start of line
:Start # :Start
\s* # Any whitespace
) # End of lookahead
(?: # Try to match...
(?! # (unless the following regex could be matched here:)
^ # Start of line
:End # :End
) # End of lookahead
. # ... any character
)* # Repeat any number of times
答案 1 :(得分:1)
我会为此而努力,似乎足够强大。还会捕获多行:
(?s)(?<=(?<!/+\s*):Start\s+)(?!//).+\s(?=:End)
(?s)乞求SingleLine选项。
答案 2 :(得分:0)
这种模式应该这样做。基本上标签必须位于行的开头,以区分真实标签和评论标签。
"\n:Start\n([^\n\/]+)\n:End"
这是Python中的一个例子。 s
是您的示例文字。
r = re.search("\n:Start\n([^\n\/]+)\n:End", s)
r.group(1)
'<Here is the text i want>'
我不完全确定.NET中的语法,但是看this我想它看起来应该是这样的:
foreach (Match match in Regex.Matches(s, "\n:Start\n([^\n\/]+)\n:End"))
Console.WriteLine("'{1}'), match.Groups[1].Value)