0

以下の状況を検証したこの正規表現:

正しい入力:

  1. 12345678,12345678,12345678
  2. *スペース*12345678、12345678、12345678、12345678
  3. 12345678,12345678,*スペース*
  4. 12345678
  5. *スペース*12345678,
  6. 12345678、

結果: true を返します (正規表現は上記の状況で正しく機能します。)

間違った入力:

  1. 1234567812345678

結果: true を返します (false のはずです)

間違った入力の場合は false を返す必要がありますが、true を返します。間違った入力を検証するにはどうすればよいですか?

   var validate_commas = /^(\s*\d{8}\s*[,]?\s*)*$/;

ありがとうございました

4

5 に答える 5

2

質問があいまいである理由と、それが得られる回答にどのように影響するかについての詳細は、説明のあいまいさを参照してください。

スペース (ASCII 32) は任意に許可されていると仮定します。

  • 文字列の先頭に
  • 文字列の最後に
  • コンマの前後。

水平タブ、改行、改行、および に一致するその他の空白文字を禁止し、スペース (ASCII 32) のみを自由に指定できるようにしたいとします。\s

上記の仮定による BNF 文法は次のとおりです。

<DIGIT>  ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<NUMBER> ::= <DIGIT> {8}
<SPACE>  ::= " "
<TOKEN>  ::= <SPACE>* <NUMBER> <SPACE>*
<LIST>   ::= <TOKEN> ( "," <TOKEN> )* [ "," <SPACE>* ]

上記の文法を使用すると、正規表現ソリューションを簡単に記述できます。

var regex = /^ *\d{8} *(?:, *\d{8} *)*(?:, *)?$/;

説明の曖昧さ

提案されているように、一致させたい文字列の例を示すのではなく、入力の文法を指定する必要があります。例はすべてのケースをカバーしていない可能性があり、回答者は通常、「気にしない」と想定するか、例に記載されていないケースについていくつかの仮定を立てます。

于 2013-04-05T16:02:11.287 に答える
0

オプションのコンマを削除すると役立ちますか?

var validate_commas = /^(\s*\d{8}\s*)(,\s*\d{8}\s*)*,?$/;

より明確な情報がなければ、これはより多くの仮定をせずに行うことができる最善の方法です.たとえば、数字は1つだけでコンマはありませんか?

于 2013-04-05T11:03:37.500 に答える
0

これはうまくいくはずです

var validate_commas = /^(\s*\d{8}\s*(?:$|,\s*))*$/;

8 つの数字の後に文字列の末尾または別のコンマが続く 1 つ以上のインスタンスが必要です。

あるいは、式を空の行に一致させたくない場合は、最後の量指定子を 1 つ以上の文字に変更します: +

var validate_commas = /^(\s*\d{8}\s*(?:$|,\s*))+$/;

次の入力に対してtrueを返します。

12345678,12345678,12345678
*space*12345678 , 12345678 , 12345678 , 12345678
12345678,12345678,*space*
12345678
*space*12345678,
12345678,

次の入力に対してfalseを返します。

1234567812345678
sdsdsfsd
12345678, 12345678 12345678

これが役立つことを願っています。

于 2013-04-05T11:57:12.370 に答える
0

次のようなことを試すことができます:

var validate_commas = /^\s*\d{8}(\s*,\s*(?:\d{8})?)*$/;

他の提案とよく似ていますが、追加の番号がオプションになり、12345678,などを許可することを除いて.

于 2013-04-05T12:09:29.083 に答える
-1

数字の間のコンマはオプションではないということですか?

これを試して:

var validate_commas = /^(\s*\d{8}\s*)(,\s*\d{8}\s*)*$/;

ちなみに、これはあなたの例が行った空の文字列を受け入れません。あなたが本当にそれを望んでいたかどうかはわかりません。

于 2013-04-05T11:01:57.360 に答える