前述のように、正規表現に入力したリテラルの空白は正規表現の一部です。正規表現によってスキャンされるテキストに同じ空白が含まれていない限り、一致は得られません。空白を使用して正規表現を作成する場合は、を指定する必要があります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.
ます (たとえば、小数部のない小数点は有効ですか?)
これら 2 つの正規表現を組み合わせるには、
まず、それぞれを括弧でグループ化します (私が行ったように、含まれるグループに名前を付けることができます)。
(?<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]+)?
最後に、シバン全体を @"..." リテラルで囲むと、準備完了です。
それだけです。