[英]How to use Regex to extract variable names and values (separated by =) (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_]*)
正则表达式仍然匹配部分变量字,因为(?<!:)
确保没有:
立即到在当前位置的左侧,然后匹配标识符而不检查字边界。 因此,在:alpha
, lpha
匹配,因为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.