1

この正規表現の例があります: http://regexr.com?34hihsvn

よりエレガントな書き方、またはより最適化された方法があるのではないかと思っています。

ルールは次のとおりです。

  • 数字とダッシュのみ。
  • 10 桁を超えてはなりません。
  • ハイフンが 2 つ必要です。
  • 各ハイフンの間に少なくとも 1 桁の数字が必要です。
  • 最後の数字は 1 桁のみにする必要があります。

私はこれが初めてなので、ヒントやヒントをいただければ幸いです。

リンクの有効期限が切れた場合、検索するテキストは

----------
22-22-1
22-22-22
333-333-1
333-4444-1
4444-4444-1
4444-55555-1
55555-4444-1
666666-7777777-1
88888888-88888888-1
1-1-1
88888888-88888888-22
22-333-
333-22
----------

私の正規表現は次のとおりです。\b((\d{1,4}-\d{1,5})|(\d{1,5}-\d{1,4}))-\d{1}\b

このサイトをテストに使用しています: http://gskinner.com/RegExr/

助けてくれてありがとう、ニック

4

3 に答える 3

1

これをm修飾子と一緒に使用できます(複数行モードをオンに切り替えます)

^\d(?!.{12})\d*-\d+-\d$

またはm修飾子なしのこれ:

\b\d(?!.{12})\d*-\d+-\d\b

設計上、これら 2 つのパターンは、ハイフンで区切られた少なくとも 3 桁の数字と一致します(したがって、量指定子をどこかに置く必要はありません{5,n}。意味がありません) 。パターンは、より速く失敗するようにも構築されています。

  • 私は数字でそれらを開始することを選択しました\d。このようにして、数字が続かない行または単語境界の各先頭はすぐに破棄されます。あと、1桁だけで残りの弦の長さがわかります。
  • 次に、最大長よりも 1 文字多いかどうかをテストする負の先読みを使用して、文字列の長さの上限をテストします(この位置に 12 文字ある場合、文字列には少なくとも 13 文字あります)。ここでドット メタ文字よりも説明的なものを使用する必要はありません。目的は、長さをすばやくテストすることです。
  • 最後に、特に何もせずに文字列の末尾を記述します。これはおそらくパターンの遅い部分ですが、不要なポジションの圧倒的多数がすでに破棄されているため、問題ではありません。
于 2013-04-15T19:34:25.710 に答える
1

これが私が思いついた正規表現です:

(?=\b[\d-]{3,10}-\d\b)\b\d+-\d+-\d\b

これは、照合を試みる前に先読みを使用して情報を検証します。[\d-]そのため、クラス の後に adashと aが続く3 ~ 10 文字を検索しdigitます。その後、実際の一致を取得して、文字列の形式が実際にdigit(dash)digit(dash)digit.

サンプル文字列から、この正規表現は次のように一致します。

22-22-1
333-333-1
333-4444-1
4444-4444-1
4444-55555-1
55555-4444-1
1-1-1

次の文字列にも一致します。

22-7777777-1
1-88888888-1
于 2013-04-15T19:34:25.510 に答える
1

あなたの正規表現は、最大長が 5 の最初と 2 番目の数字グループのみを許可します。したがって、1-12345678-1またはのような有効な文字列123456-1-1は一致しません。

この正規表現は、指定された要件に対して機能します。

\b(?:\d\-\d{1,8}|\d{2}\-\d{1,7}|\d{3}\-\d{1,6}|\d{4}\-\d{1,5}|\d{5}\-\d{1,4}|\d{6}\-\d{1,3}|\d{7}\-\d{1,2}|\d{8}\-\d)\-\d\b

(正規表現)

于 2013-04-15T19:07:56.890 に答える