匹配字符串中的变量

时间:2018-04-28 08:20:57

标签: c# regex

我希望匹配字符串中的变量,这些变量使用美元符号$进行寻址。但是,我的正则表达式匹配转义后的美元符号后的字符序列(例如,使用反斜杠\$进行转义)。
如果使用另一个(\\)转义反斜杠,则当然应匹配以下变量。

TL; DR :任何序列$xxxxx应匹配,,如果它遵循偶数反斜杠\(0,2) ,4,6,......)。反斜杠本身应该成为捕获组的一部分。

我目前有以下表达式:(?:[^\\]*(\\{2})*)(\$[a-z_]\w*\b), 但它在以下文本中无效(当然使用选项\igm):

Hello $var, this is a backslash followed by a dollar: \\\$
$test \$escaped \\$not_escaped \\\$escaped_again \\\\$you_get_the_idea

匹配的“变量”应为$var$test$not_escaped$you_get_the_idea
但是,https://regex101.com会显示其他匹配项。

我无法理解错误。

3 个答案:

答案 0 :(得分:4)

将此正则表达式与lookbehind断言一起使用,可以捕获组1中的变量字符串:

(?<!\\)(?:\\\\)*(\$\w+)

Demo on regex101.com

答案 1 :(得分:0)

使用C#中的一些额外逻辑,您可以使用此正则表达式:

(?<esc>\\*)\$(?<var>\w+)

它将分为两组 - 首先是反斜杠,第二组是变量名。现在你只需要在第一组中丢弃奇数长度的匹配。试试这段代码:

var regex = new Regex("(?<esc>\\\\*)\\$(?<var>\\w+)", RegexOptions.Multiline);
var text = "Hello $var, this is a backslash $ followed by a dollar: \\\\\\$\r\n$test \\$escaped \\\\$not_escaped \\\\\\$escaped_again \\\\\\\\$you_get_the_idea";
foreach (Match match in regex.Matches(text))
{
    if (match.Groups["esc"].Length % 2 == 0)
        Console.WriteLine(match.Groups["var"].Value);
}

Demo

答案 2 :(得分:-1)

你可以简单试试这个正则表达式: - [\ $] [\ W] *