1
const string numericReg = "\\d+"; // Matches a digit character. Equivalent to [0-9].
const string realNumsReg = numericReg + b + "(\\." + b + numericReg + ")?";
        const string b = "\\s*";

このステートメントは正しいです:

  private const string rte = "(?<rate>" + realNumsReg + ")" +
                            "(?=(?<rte1>" + b + "qs " + "))";

このステートメントは正しいです:

 private const string barl = "(?<barl>" + numericReg + ")" +
                                    "(?=((?<q>" + b + "point to print )))";

これはrteにも当てはまります:

  MatchCollection s = Regex.Matches
                ("3000 qs / min", rte , RegexOptions.IgnoreCase);

これはbarlにも当てはまります。

  MatchCollection s = Regex.Matches
                ("6 point to print  ", barl , RegexOptions.IgnoreCase);

なぜこれが間違っているのですか?

  MatchCollection s = Regex.Matches
                ("6 point to print  3000 qs/ min", barl+b+rte  , RegexOptions.IgnoreCase);
4

1 に答える 1

0

最初の問題: 3,000 のコンマ (',')。最初の Matches は「000 rds」に一致します。3 番目の Regex.Matches の「3」に一致するものはありません。

2番目(あまり目立たない問題):

2 つの先読みアサーション (?=) は一致しないアサーションであるため、3 番目の正規表現の最初のアサーション内にあるものと一致するものはありません。

あなたの場合: 'barl' + 'b' + 'rte'

「barl」は「6 バレル/マウント」の「6」に一致し、「b」は「6」と「バレル」の間のスペースに一致し (「バレル/マウント」は先読みによってアサートされますが、一致しません)、「rte」 ' は、'rds' が後に続く数字と一致することはできません。

式からコンマと先読みを削除するだけです。必要のないグループにはとにかく名前が付けられており、それらが一致するものは Match の Groups コレクションから簡単に取得できるため、実際には必要ありません。

改良点:

  1. qs だけでなく、「qs / min」の「/ min」にも一致するように rte を変更することをお勧めします。
  2. numericReg を @"\d+(,\d{3})*(.\d+)?" に変更します。(0 個以上のコンマが続く任意の数の数字と、正確に 3 桁のグループ、および数字が続くドットの 1 つまたは 0 個のグループに一致します)。この正規表現は、次の形式の数値に一致します: 3000 3,000 3,000.0000
于 2012-10-02T06:32:08.390 に答える