4

次の正規表現を作成しました。

(\d{5}|\d-\d{4}|\d{2}-\d{3}|\d{3}-\d{2}|\d{4}-\d)

そしてそれはうまくいくようです。つまり、5 桁の数字またはハイフンが 1 つしかない 5 桁の数字に一致しますが、ハイフンを先頭または末尾にすることはできません。

同様の正規表現が欲しいのですが、25桁の数字が必要です。上記と同じ戦術を使用すると、正規表現は非常に長くなります。

誰でも簡単な正規表現を提案できますか?

追記事項: この正規表現は、ASP.NET アプリケーションで使用される XML ファイルに入れています。.net バックエンド コードにアクセスできません。しかし、私は彼らがこれに似た何かをするのではないかと思います:

Match match = Regex.Match("Something goes here", "my regex", RegexOptions.None);
4

5 に答える 5

10

先読みを使用する必要があります。

^(?:\d{25}|(?=\d+-\d+$)[\d\-]{26})$

説明:

  • 最初\d{25}から最後まで、25桁です。
  • または: 26 文字の[\d\-](数字またはハイフン)であり、かつ一致した\d+-\d+- つまり、真ん中にハイフンが 1 つだけあることを意味します。

正規表現の視覚化

テスト ケースを使用した作業例

于 2013-08-22T19:25:15.617 に答える
5

次の正規表現を使用できます。

^[0-9](?:(?=[0-9]*-[0-9]*$)[0-9-]{24}|[0-9]{23})[0-9]$

先読みではダッシュが 1 つだけであることを確認し、文字クラスでは最初と最後の間に 23 個の数字があることを確認します。と思いますが、もっと短くするかもしれません。

編集:「少し」短いxP

^(?:[0-9]{25}|(?=[^-]+-[^-]+$)[0-9-]{26})$

とはいえ、コビのものに少し似ていることは認めます。

于 2013-08-22T19:22:41.970 に答える
0

これは 25 桁の数字とちょうど 1 つのハイフンに一致します。

^(?=(-*\d){25})\d.{24}\d$
于 2013-08-22T22:13:51.100 に答える
0

長さにまったくこだわらない場合 (つまり、オプションでハイフンを含む数字の文字列のみが必要な場合) は、次のように使用できます。

([\d]+-[\d]+){1}|\d

(状況によっては、これに行/単語の境界を追加することもできます)

特定の長さの一致が必要な場合、このパターンは実際には機能しません。Kobi の答えは、おそらくあなたにより適しています。

于 2013-08-22T20:30:19.133 に答える
0

最速の方法は、単純な一致を実行してからキャプチャ バッファーの長さを合計することだと思います。正規表現で計算を試みても意味がありません。

 ^(\d+)-?(\d+)$
于 2013-08-22T21:27:30.253 に答える