3

長い質問でごめんなさい。例を示すのがおそらく最善です。

行列を文字列として一致させようとしています:

  1. [[]]
  2. [[][][]]
  3. [[0][1][2]]
  4. [[,,][,,][,,]]
  5. [[0,1,2][3,4,5]]

正規表現が見栄えがすることはめったにありませんが、これが私が思いついたものです。

\[(\[-?(\d+(\.\d*)?)*(,-?(\d+(\.\d*)?)*)*\])+\]

それはすべてに一致します。ただし、コンマは常にn回繰り返す必要があります。5つのコンマ、次に4つのコンマ、次に6つのコンマがある場合、それは有効なマトリックスではありません。使用できるフラグや変数はありますか?それとも正規表現の範囲外ですか?

4

1 に答える 1

1

いいえ、正規表現ではそれができません。

これは、あなたと非常によく似たケースが不可能であるという正式な証明です。言語L={a n b n:n≥0}は「正規言語」ではないため、正規表現と一致させることはできません。その言語は本質的a*b*に2つの星が同じ回数繰り返されることです。あなたのケースも同じ回数繰り返される星を含んでいるので、それも不可能です。

あなたの場合、おそらく最良のオプションは、正規表現を使用してマトリックスの各「行」に一致させることです。つまり\[([^][]*)\]、行のコンテンツである一致グラブグループ1ごとに、グローバル検索を実行してから、コンマの数を数えます。そして、すべてのカウントを比較します(または、実際に数値が必要な場合は、言語の分割操作を使用して、コンマで分割します)。

PS:[^][]は、開き角かっこと閉じかっこを除くすべての文字の文字クラスです。閉じ括弧は^の後の最初の文字である必要があります。これは特殊なケースです。

于 2013-02-23T19:14:11.603 に答える