0

2 つのパターンを組み合わせRegular Expressionて、文字列が double 値か変数かを判断しようとしています。私の制限は次のとおりです。

変数は _ またはアルファベット文字 (A ~ Z、大文字と小文字を区別しない) でのみ開始できますが、その後に 0 個以上の _s、文字、または数字を続けることができます。

これが私がこれまでに持っているものですが、適切に機能させることはできません。

String varPattern = @"[a-zA-Z_](?: [a-zA-Z_]|\d)*";
String doublePattern = @"(?: \d+\.\d* | \d*\.\d+ | \d+ ) (?: [eE][\+-]?\d+)?";

String pattern = String.Format("({0}) | ({1})",
                             varPattern, doublePattern);
Regex.IsMatch(word, varPattern, RegexOptions.IgnoreCase)

両方の正規表現パターンをキャプチャしているようですが、どちらかにする必要があります。

たとえば、上記のコードを使用すると _A2 2 は有効ですが、_A2 は無効です。

有効な変数の例を次に示します。

_X6、_、A、Z_2_A

また、無効な変数の例は次のとおりです。

2_X6、$2、T_2$

正規表現のパターン形式を明確にする必要があると思います。形式は私には不明です。

4

3 に答える 3

2

前述のように、正規表現に入力したリテラルの空白は正規表現の一部です。正規表現によってスキャンされるテキストに同じ空白が含まれていない限り、一致は得られません。空白を使用して正規表現を作成する場合は、を指定する必要があります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]+)?
    
  • 最後に、シバン全体を @"..." リテラルで囲むと、準備完了です。

それだけです。

于 2013-09-26T00:19:23.850 に答える