2013-10-05 2 views
0

Я пытаюсь дать пользователю добавить пробелы в пределах 10 символов для их имени. И если они этого не хотят, у них будет возможность сохранить имя без пробелов: myNameLength и myNoNums отлично сочетаются.Добавление пробелов с помощью границы с использованием регулярных выражений

Я не уверен, как представлять space в регулярных выражениях.
Я использовал this website, чтобы помочь мне понять регулярные выражения немного больше, а также JPS, но я не могу найти правильный синтаксис.

До сих пор я пробовал то, что было написано ниже, а также \\t{0,10}","[ ]{0,10} и [\\s]*. Также я знаю, что это не \t или \s, потому что Java использует регулярные выражения по-разному.

Вот почему мне интересно:
Есть ли другой способ, чем обычно для 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)); 
     } 

ответ

1

Проверка имен с регулярным выражением не является хорошей идеей, но если вы хотите, чтобы любой символ, включая пробелы, вы можете использовать регулярные выражения:

.{1,10} 

Но если вы хотите иметь только \w без цифр, но с пространством, вы можете использовать одиночное регулярное выражение:

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

С текущей настройкой вашего кода вы убедились, что имя mached от 0 до 10 пробелов и никаких других символов.

+0

Я просто пытаюсь получить более знакомое с регулярным выражением на Java, и дело в том, что я не хочу, чтобы там было место, если игрок не хочет этого делать, делая {1,10} игрок, по крайней мере, предоставил место для своего имени, я думал, что если бы я сделал это отдельно для пространства, это сделало бы его более гибким. –

+0

Вы бы рекомендовали вместо регулярного выражения для тестовых случаев? –

+0

@AntonioGarcia Регулярное выражение выше позволяет пользователю вводить пробелы, если они хотят; поэтому, если они не хотят, они все равно могут. И что вы подразумеваете под «для тестовых случаев»? Чего вы пытаетесь достичь именно? – Jerry

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(). Опять же, я бы разделил их на отдельные строки на практике; это было для краткости.

Вы упомянули выражение, указанное вами, для проверки явно символа табуляции, который, похоже, не является тем, что вы хотите; \\s проверяет любой символ пробела. Вы также можете отменить эти специальные символы регулярного выражения, используя их; string.matches("\\S+") скажет вам, состоит ли строка, состоящая исключительно из символов без пробелов.

Кроме того, утверждение вашего теста потерпит неудачу на имена с пробелами, потому что вы звоните s.matches(myNameLength), который проверяет, что вся строка состоит из от 1 до 10 слов символов; «символ слова» определяется как [a-zA-Z0-9_]. Любые пробелы в тестовой строке и matches() вернутся false.

+0

Извините, если я не был достаточно явным, я создаю тестовые примеры для игры, прямо сейчас я хочу, чтобы пользователь мог создать свое имя и, возможно, иметь второе имя, вроде «Боб Смит», однако я не удалось проверить пробелы для имени с помощью регулярного выражения, тестовые случаи терпят неудачу каждый раз. –

0

Вы имеете в виду, что хотите разрешить до десяти букв вместе с дополнительными пространствами, которые не считаются длиной? Вы могли бы искать для этого:

"^(?:[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. Вы также можете использовать шестнадцатеричный escape ("\\x20") или Unicode escape ("\\u0020").

Смежные вопросы