繁体   English   中英

Regex(C#) - 如何匹配以冒号开头的变量名

[英]Regex (C#) - how to match variable names that start with a colon

我需要在我试图解析的一些表达式中区分变量名和非变量名。 变量名以冒号开头,可以有(但不是以数字开头)数字,并且有下划线。 所以有效的变量名是:

:x :_x :x2 :alpha_x   // etc

然后我必须在表达式中挑选出不以冒号开头的其他单词。 所以在下面的表达式中:

:result = median(:x,:y,:z)

变量将是:result,:x,:y和:z,而另一个非变量字将是中位数。

我的正则表达式是选择变量名称(这是有效的):

:[a-zA-Z_]{1}[a-zA-Z0-9_]*

但我无法弄清楚如何获得非变量词。 我的正则表达式是:

(?<!:)([a-zA-Z_]{1}[a-zA-Z0-9_]*)

问题是,匹配仅排除后面的第一个字符:如下所示:

在此输入图像描述

以下模式似乎有效:

(?<=[^A-Za-z0-9_:])[a-zA-Z_]{1}[a-zA-Z0-9_]*

lookbehind (?<=[^A-Za-z0-9_:])断言前面的内容既不是变量名中允许的字符,也不是冒号。 然后,这将标记非变量字的开头。

演示

(?<!:)([a-zA-Z_]{1}[a-zA-Z0-9_]*)正则表达式仍然匹配部分变量字,因为(?<!:)确保没有:立即到在当前位置的左侧,然后匹配标识符而不检查字边界。 因此,在:alphalpha匹配,因为l前面有一个除了以外的字符:

因此,通过在[a-zA-Z_]之前添加单词边界来轻松解决问题:

var words = Regex.Matches(s, @"(?<!:)\b[a-zA-Z_]\w*", RegexOptions.ECMAScript)
        .Cast<Match>()
        .Select(x => x.Value)
        .ToList();

请参阅正则表达式演示 请注意,您不需要使用捕获组包装整个模式。

图案细节

  • (?<!:) - 确保没有:紧靠当前位置的左侧
  • \\b - 单词边界:确保当前位置的左侧没有字母,数字或_
  • [a-zA-Z_] - 匹配ASCII字母或_
  • \\w* - 0+ ASCII字母,数字或_必须与ECMAScript选项一起使用才能匹配ASCII字母和数字,并使字边界仅处理ASCII)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM