0

ユーザーが名前の 10 文字の境界内にスペースを追加できるようにしようとしています。そうしたくない場合は、スペースなしで名前を保持するオプションがあり、完全に一致します myNameLengthmyNoNums

space正規表現でa を表す方法がわかりません。このウェブサイト
を 使用して、正規表現とJPSをもう少し理解しましたが、正しい構文を見つけることができません。

\\t{0,10}","[ ]{0,10}これまでのところ、以下に書かれているものと,andを試しました[\\s]*。また、Java では正規表現の使い方が異なるため、そうでは\tないこともわかっています。\s

それが私が疑問に思っている理由です
.Javaが境界を持つスペースをコーディングするための通常とは異なる方法はありますか?

 @Test
        public void testName() 
        {
            String myNameLength = "\\w{1,10}";
            String myNoNums = "[^\\d]{1,10}";
            String mySpaces = "\\s{0,10}";

            Player p = new Player();
            p.Player("Antonio");
            String s = p.getName();
            assertTrue(s.matches(myNameLength) && s.matches(myNoNums) && s.matches(mySpaces));  
        }
4

3 に答える 3

1

正規表現で名前を検証するのは良い考えではありませんが、スペースを含む任意の文字を許可したい場合は、正規表現を使用できます。

.{1,10}

ただし、\w数字なしでスペースのみを使用したい場合は、単一の正規表現を使用できます。

[\\w &&[^\\d]]{1,10}

コードの現在のセットアップでは、名前が 0 から 10 個のスペースに一致し、他の文字がないことを確認していました。

于 2013-10-05T16:33:27.520 に答える
0

長さにカウントされないオプションのスペースと一緒に、最大 10 文字を許可したいということですか? あなたはこれを探しているかもしれません:

"^(?:[a-z] *){1,9}[a-z]$"  // spaces allowed within the name, but not at the ends

...またはこれ:

"^(?: *[a-z]){1,10} *$"    // spaces allowed everywhere

CASE_INSENSITIVE正規表現をコンパイルするときは必ずモードを指定してください。

正規表現でのスペース文字のマッチングに関しては、トリックはありません。私が行ったように、文字通りのスペースを使用するだけです。COMMENTSしかし、それは少しぎこちなく見え、モードでは機能しません。"\\x20"16 進エスケープ ( ) または Unicode エスケープ ( )も使用できます"\\u0020"

于 2013-10-05T20:20:51.087 に答える
0

私はあなたの要件について少し曖昧ですが、あなたの質問を読むと、あなたがやろうとしているのは数字を除外して長さを制限することだけのように見えるので、明示的にスペースをチェックすることを心配する必要はありません; 何かのようなもの

public boolean isValid(String name) {
   if (name==null) { 
       return false; 
   }
   int len = name.length();
   Pattern digit = Pattern.compile("\\d");
   return len>0 && len<=10 && !digit.matcher(name).find();
}

本当に正規表現を使いたい場合はうまくいくはずです。もちろん、このルートを使用する場合は、正規表現をPatternクラスに対して一度だけコンパイルされたものとして保存することもお勧めします。digit宣言をクラスの先頭に移動しますprivate Pattern digit = Pattern.compile("\\d");

編集:あなたの明確な質問に答えていないことに気づきました。「境界のある空間」の意味がわかりません。正規表現を使用して文字列がスペースで終わるかどうかを確認する場合は、次のようになりますPattern.compile("\\s+$").matcher(string).find()($ 文字は入力の終わりを表します)。文字列がスペースで始まるPattern.compile("^\\s+").matcher(string).find()かどうかを確認するには、 . 繰り返しますが、実際にはこれらを別々の行に分割します。これは簡潔にするためでした。

あなたが言及した\\t式は、タブ文字を明示的にチェックするために使用されますが、これはあなたが望むものではないようです。\\s空白文字をチェックします。これらの特殊な正規表現文字を大文字にすることで無効にすることもできます。string.matches("\\S+")文字列が完全に非空白文字で構成されているかどうかがわかります。

また、文字列全体が 1 ~ 10 個の単語文字で構成されs.matches(myNameLength)ていることを確認する を呼び出しているため、スペースを含む名前ではテストのアサーションが失敗します。「単語文字」は [a-zA-Z0-9_] として定義されます。テスト文字列にスペースがあれば、が返されます。matches()false

于 2013-10-05T18:32:22.010 に答える