1

正規表現を理解したと思ったとき。それはすべて元に戻されます。英数字と空白文字以外が見つかった場合は、偽のチェックを返すことを期待しています。

function checkName(fname)
{ 
  var rexp = new RegExp(/[^a-zA-Z0-9]\s/gim)
  if (!rexp.test(fname))
    {
      alert ("'" + fname + "'\nis okay")
    }
    else
    {
       alert ("'" + fname + "'\nis NOT okay")
    }
  return !rexp.test(fname)
}

上記のコードが次の場合に返されることを願っています

  • 「これでいい」 - 本当
  • "これは、大丈夫ではありません" -false
  • 「これでもいいじゃない!」-間違い
  • 「これでもいい」 - false
4

4 に答える 4

2

議論の多くは正しいですが、文字クラスを反転し、関数で結果を反転するという点がすべて欠けているようです。これは論理的に読みにくい。また、正当な理由もなく、正規表現に対して 2 つのテストを実行します。はるかにきれいなのは次のようなものです:

function checkName(fname) { 
    var result = /^[a-z0-9\s]+$/i.test(fname)

    if (result) {
        alert ("'" + fname + "'\nis okay")
    } else {
        alert ("'" + fname + "'\nis NOT okay")
    }
    return result;
}

更新: ジャックの編集もこれらの点を捉えているようです。(いつも1分遅れてニッケルショート...)

于 2013-02-19T13:37:11.767 に答える
1

いくつかのこと:

  1. /something/の省略表記ですnew RegExp('something')。それらを混同してはいけません。

  2. \s文字クラス内を移動する必要があります。それ以外の場合は、英数字以外の文字の後にスペースが続く文字に一致します。

  3. これらすべての修飾子は必要ないと思います:

    1. /m式にアンカーがある場合にのみ役立ちます。
    2. /i文字クラスからA-Zまたはを削除すると使用できます。a-z
    3. /g複数回一致する必要がある場合にのみ役立ちますが、あなたの場合は最初の一致で十分です。

      var rexp = /[^a-zA-Z0-9\s]/;
      

関数全体は次のように記述できます。

function checkName(fname)
{
    return !/[^a-zA-Z0-9\s]/.test(fname);
}

二重否定を使用する代わりに、「これらの文字のみを許可する」と言ったほうがよいでしょう:

function checkName(fname)
{
    return /^[a-zA-Z0-9\s]*$/.test(fname);
}

空でない名前もテストする必要がある場合は、 を使用する必要があります/^[a-zA-Z0-9\s]+$/

于 2013-02-19T13:03:27.327 に答える
1
[^a-zA-Z0-9]\s

正規表現では、文字/数字の後に空白が必要です。

それを修正するには\s、ブラケットの内側を動かします。

ただし、もう 1 つやらなければならないことがあります。正規表現は、これらの文字の1 つにのみ一致します。+1 つ以上に一致するように a を追加します。

したがって、正規表現を修正しました:

[^a-zA-Z0-9\s]+
于 2013-02-19T13:04:01.163 に答える
0

試す:

function checkName(fname)
{ 
  var rexp = new RegExp(/^[a-z0-9\s]+$/i)
  if (!rexp.test(fname))
    {
      alert ("'" + fname + "'\nis okay")
    }
    else
    {
       alert ("'" + fname + "'\nis NOT okay")
    }
  return !rexp.test(fname)
}
于 2013-02-19T13:08:05.590 に答える