Regex принимать только алфавиты и пробелы и запрещать пробелы в начале и конце строки

У меня есть следующие требования для проверки поля ввода:

It should only contain alphabets and spaces between the alphabets. It cannot contain spaces at the beginning or end of the string. It cannot contain any other special character.

Я использую следующее регулярное выражение для этого:

^(?!\s*$)[-a-zA-Z ]*$

Но это позволяет пробелы в начале. Любая помощь приветствуется.

 Crazenezz22 мая 2012 г., 10:57
Попробуйте онлайн на этомsite

Ответы на вопрос(5)

Я думаю, что проблема есть? до отрицания пробелов, что означает, что это необязательно

Это должно работать:

[a-zA-Z]{1}([a-zA-Z\s]*[a-zA-Z]{1})?

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

 22 мая 2012 г., 14:59
спасибо за советы :-)
 22 мая 2012 г., 12:01
Нет,(?!\s*$) является негативным взглядом; он утверждает, что из текущей позиции (которая является началом строки, благодаря предыдущему^) невозможно сопоставить ноль или более пробельных символов, за которыми следует конец строки. Это неверно, но не по той причине, которую вы предложили.Your регулярное выражение будет работать, но вы должны избавиться от{1} (который не имеет никакого эффекта) и якоря. Якоря необязательны, если вы используете Javamatches() метод, но они помогают сигнализировать о ваших намерениях, и они облегчают портирование регулярных выражений на другие варианты.

Попробуй это:

^(((?<!^)\s(?!$)|[-a-zA-Z])*)$

Это выражение используетnegative lookahead and negative lookbehind запретить пробелы в начале или в конце строки и требовать совпадения всей строки.

 22 мая 2012 г., 12:09
Не нужно так увлекаться. Как продемонстрировали остальные три респондента, это тот случай, когда правильно сопоставить то, что выdo достаточно, чтобы отфильтровать то, что выdon't хочу.
 22 мая 2012 г., 11:03
@Crazenezz Спасибо, пропал) в конце.
 22 мая 2012 г., 12:16
@AlanMoore Что "необычного" ты о чем? Lookarounds являются основными направлениями в эти дни. Выражение"match a letter, or a space except at the beginning or at the end of the input" это легко понять, кроме того, что это единственное решение, которое не повторяет класс персонажа[-A-Za-z], Это всего лишь синтаксис, который делает его сложным, но по своей сути он тривиален.
 22 мая 2012 г., 11:00
Произошла ошибка с вашим регулярным выражением, проверьте еще раз скобки
 22 мая 2012 г., 13:20
Я говорю, зачем использовать сложный синтаксис, если простой синтаксис работает хотя бы так же? Когда вы знаете, что означают символы, становится очевидным не только то, что^[a-zA-Z]+(\s+[a-zA-Z]+)*$ соответствует именно тому, что хотел, но чтобы он делал это максимально эффективно. Согласно RegexBuddy, это регулярное выражение соответствует строке"Lorem ipsum tritani impedit civibus ei pri" только двадцать два шага, где ваш беретtwo hundred и двадцать два!

Это должно работать, если вы используете его сString.matches метод. Я полагаю, вы хотите английский алфавит.

"[a-zA-Z]+(\\s+[a-zA-Z]+)*"

Обратите внимание, что\s позволит все виды пробельных символов. В Java это было бы эквивалентно

[ \t\n\x0B\f\r]

К ним относятся горизонтальный язычок (09), перевод строки (10), возврат каретки (13), подача формы (12), обратный ход (08), пространство (32).

Если вы хотите специально разрешить только пространство (32):

"[a-zA-Z]+( +[a-zA-Z]+)*"

Вы можете дополнительно оптимизировать приведенное выше регулярное выражение, сделавcapturing группа( +[a-zA-Z]+) non-capturing (сString.matches вы все равно не сможете получить слова по отдельности). Также можно изменить квантификаторы, чтобы сделать ихpossessive, так как здесь нет смысла возвращаться назад.

"[a-zA-Z]++(?: ++[a-zA-Z]++)*+"
 22 мая 2012 г., 12:13
Да. Я предполагаюmatches() метод. Спасибо за разъяснения. +1.
 22 мая 2012 г., 12:10
Исправьте, если вы используете Javamatches() метод, но я бы все равно его закрепил:^([a-zA-Z]+\s+)*[a-zA-Z]+$

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

^[a-zA-Z]+(( )+[a-zA-z]+)*$

Если не может:

^[a-zA-Z]+( [a-zA-z]+)*$

Строка должна начинаться с буквы (или нескольких букв), а не с пробела.

Строка может содержать несколько слов, но перед каждым должно стоять пробел.

Надеюсь, я помог.

 28 мая 2012 г., 10:56
После того, как я снова внимательно прочитал, возможно, мое мышление пошло не так. Я подумал, что если есть строка, как в моем примере выше, она проверит и удалит пробел до и после заполненной строки и покажет результат (Интересно, если OP хочет перехватить даже введенный пользователем неверный код, например<space>Hello World<space>).
 28 мая 2012 г., 08:51
ОП спросилIt cannot contain spaces at the beginning or end of the string., так что если пример, как это:<space><string><space><string><space> результат будет<string><space><string>, Ваше регулярное выражение может решить эту проблему<string><space><string>Если пользователь введет проблему, как в моем примере, до того, как ваше регулярное выражение не сможет ее решить.
 28 мая 2012 г., 10:57
Я повторно проголосую, но мне нужно за 2 часа до повторного голосования. Я надеюсь, что нет никаких трудностей для этого :-)
 28 мая 2012 г., 10:43
Я не согласен. ОП попросил регулярное выражение дляvalidating an input field, Так что для данных, как<space><string><space><string><space> соответствие должно вернутьсяfalseи вот как работает мое регулярное выражение.
Решение Вопроса

Для меня единственный логичный способ сделать это:

^\p{L}+(?: \p{L}+)*$

В начале строки должна быть хотя бы одна буква. (Я заменил ваш[a-zA-Z] по свойству кода Unicode для писем\p{L}). Тогда может быть пробел, за которым следует хотя бы одна буква, эту часть можно повторить.

\p{L}: любое письмо от любого языка. Увидетьregular-expressions.info

Проблема в вашем выражении^(?!\s*$) в том, что упреждения не удастся, если есть только пробелыtill the end of the string, Если вы хотите запретить начальные пробелы, просто удалите конец привязки строки внутри lookahead == & gt;^(?!\s)[-a-zA-Z ]*$, Но это все еще позволяет строке заканчиваться пробелом. Чтобы избежать этого, оглянемся на конец строки^(?!\s)[-a-zA-Z ]*(?<!\s)$, Но я думаю, что для этой задачи осмотреться не нужно.

 22 мая 2012 г., 11:45
+1. Я пропускаю поддержку Unicode до сих пор.

Ваш ответ на вопрос