如何提取正则表达式注释

时间:2011-02-22 03:58:03

标签: regex

我有这样的正则表达式

(?<!(\w/))$#Cannot end with a word and slash

我想从最后提取评论。虽然这个例子没有反映出这种情况,但可能有一个正则表达式包含哈希的正则表达式。

\##value must be a hash

正则表达式将提取注释,以确保在使用可能包含非注释的#的正则表达式时是安全的。

3 个答案:

答案 0 :(得分:7)

这是一个.Net风格的正则表达式,用于部分解析.Net风格模式,它应该非常接近:

\A
(?>
    \\.         # Capture an escaped character
    |           # OR
    \[\^?       # a character class
        (?:\\.|[^\]])*    # which may also contain escaped characters
    \]
    |           # OR
    \(\?(?# inline comment!)\#      
        (?<Comment>[^)]*)
    \)
    |           # OR
    \#(?<Comment>.*$)   # a common comment!
    |           # OR
    [^\[\\#]    # capture any regular character - not # or [
)*
\z

幸运的是,在.Net中,每个捕获组都会记住它的所有捕获,而不仅仅是最后一次捕获,因此我们可以在一个解析中找到Comment组的所有捕获。正则表达式几乎解析正则表达式 - 但几乎不完全,它只是解析足以找到评论 以下是您使用结果的方式:

Match parsed = Regex.Match(pattern, pattern,
                           RegexOptions.IgnorePatternWhitespace | 
                           RegexOptions.Multiline);
if (parsed.Success)
{
    foreach (Capture capture in parsed.Groups["Comment"].Captures)
    {
        Console.WriteLine(capture.Value);
    }
} 

工作示例:http://ideone.com/YP3yt

最后一句警告 - 这个正则表达式假定整个模式处于IgnorePatternWhitespace模式。如果未设置,则所有#都按字面匹配。请记住,标志可能会在单个模式中多次更改。例如,在(?-x)#(?x)#comment中,无论IgnorePatternWhitespace如何,第一个#按字面匹配,(?x)重新打开IgnorePatternWhitespace标志,第二个{{} 1}}被忽略。

如果您需要强大的解决方案,可以使用正则表达式语言解析器 您可以调整.Net源代码并提取解析器:

答案 1 :(得分:1)

这样的东西应该有效(如果你在正则表达式的每一行单独运行它)。评论本身(如果存在)将在第三个捕获组中。

/^((\\.)|[^\\\#])*\#(.*)/

(\\.)匹配转义字符,[^\#]匹配任何非斜杠非哈希字符,以及它们在评论之前与整行匹配的*量词。然后正则表达式的其余部分检测注释标记并提取文本。

答案 2 :(得分:1)

正则表达式解析中忽略的一个选项是RightToLeft模式。

  

从最后提取评论。

如果我们从的末尾开始工作,那么可以简单地使用模式。如

^          
  .+?            # Workable regex 
 (?<Comment>     # Comment group
   (?<!\\)       # Not a comment if escaped.
   \#            # Anchor for actual comment
   [^#]+         # The actual commented text to stop at #
 )?              # We may not have a comment 
$

在C#中使用上述模式,使用这些选项RegexOptions.RightToLeft | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline

  

可能有正则表达式包含哈希的正则表达式

此行(?<!\\) # Not a comment if escaped.通过说明是否有进展\来处理这种情况,我们没有评论。