我有这样的正则表达式
(?<!(\w/))$#Cannot end with a word and slash
我想从最后提取评论。虽然这个例子没有反映出这种情况,但可能有一个正则表达式包含哈希的正则表达式。
\##value must be a hash
正则表达式将提取注释,以确保在使用可能包含非注释的#的正则表达式时是安全的。
答案 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);
}
}
最后一句警告 - 这个正则表达式假定整个模式处于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.
通过说明是否有进展\
来处理这种情况,我们没有评论。