如前所述,您在正则表达式中放入的文字空格是正则表达式的一部分。除非在正则表达式扫描的文本中存在相同的空格,否则您不会得到匹配项。如果你想使用空格来制作你的正则表达式,你需要指定RegexOptions.IgnorePatternWhitespace
,之后,如果你想匹配任何空格,你必须明确地这样做,或者通过指定\s
,\x20
等。
应该注意的是,如果你指定了RegexOptions.IgnorePatternWhitespace
,你可以使用 Perl 风格的注释(#
到行尾)来记录你的正则表达式(就像我在下面所做的那样)。对于复杂的正则表达式,5 年后的某个人——可能就是你!——会感谢你的好意。
我认为,您的 [可能是预期的] 模式也比它们需要的更复杂。与您指定的标识符规则匹配的正则表达式如下:
[a-zA-Z_][a-zA-Z0-9_]*
分解成它的组成部分:
[a-zA-Z_] # match an upper- or lower-case letter or an underscore, followed by
[a-zA-Z0-9_]* # zero or more occurences of an upper- or lower-case letter, decimal digit or underscore
匹配数字/浮点文字的常规样式的正则表达式是:
([+-]?[0-9]+)(\.[0-9]+)?([Ee][+-]?[0-9]+)?
分解成它的组成部分:
( # a mandatory group that is the integer portion of the value, consisting of
[+-]? # - an optional plus- or minus-sign, followed by
[0-9]+ # - one or more decimal digits
) # followed by
( # an optional group that is the fractional portion of the value, consisting of
\. # - a decimal point, followed by
[0-9]+ # - one or more decimal digits
)? # followed by,
( # an optional group, that is the exponent portion of the value, consisting of
[Ee] # - The upper- or lower-case letter 'E' indicating the start of the exponent, followed by
[+-]? # - an optional plus- or minus-sign, followed by
[0-9]+ # - one or more decimal digits.
)? # Easy!
注意: 一些语法在值的符号是一元运算符还是值的一部分以及是否+
允许前导符号方面有所不同。对于类似的东西123245.
是否有效,语法也会有所不同(例如,没有小数位的小数点是否有效?)
要结合这两个正则表达式,
首先,用括号将它们分组(您可能想要命名包含组,就像我所做的那样):
(?<identifier>[a-zA-Z_][a-zA-Z0-9_]*)
(?<number>[+-]?[0-9]+)(\.[0-9]+)?([Ee][+-]?[0-9]+)?
接下来,结合交替操作,|
:
(?<identifier>[a-zA-Z_][a-zA-Z0-9_]*)|(?<number>[+-]?[0-9]+)(\.[0-9]+)?([Ee][+-]?[0-9]+)?
最后,将整个 shebang 括在一个 @"..." 文字中,你应该很高兴。
这就是它的全部内容。