Помогите с регулярным выражением - PullRequest
0 голосов
/ 03 декабря 2010

Я создаю регулярное выражение, которое будет принимать по крайней мере 1 буквенно-цифровой символ и любое количество пробелов.

Сейчас у меня есть ... [A-Za-z0-9]+[ \t\r\n]*, который, как я понимаю, равен по крайней мере 1буквенно-цифровой ИЛИ хотя бы 1 пробел.Как бы это исправить?

РЕДАКТИРОВАТЬ: Чтобы ответить на комментарии ниже, я хочу, чтобы он принимал строки, содержащие буквенно-цифровой ATLEAST 1 И любое количество (включая отсутствие) пробелов.Прямо сейчас он примет ПРОСТО пробел.

РЕДАКТИРОВАТЬ2: Чтобы уточнить, я не хочу, чтобы любое количество пробелов (включая 0) было принято, если есть хотя бы 1 буквенно-цифровой символ

Ответы [ 4 ]

2 голосов
/ 03 декабря 2010
\s*\p{Alnum}[\p{Alnum}\s]*

Ваше регулярное выражение, [A-Za-z0-9]+[ \t\r\n]*, требует, чтобы строка начиналась с буквы или цифры (или, точнее, она не начинает совпадать, пока не увидит).Добавление \s* позволяет начинать совпадение с пробела, но вы по-прежнему не будете сопоставлять никакие буквенно-цифровые символы после первого символа пробела, который следует за буквенно-цифровым (например, он не будет совпадать с xyz вabc xyz. Изменение конечного значения \s* на [\p{Alnum}\s]* устраняет эту проблему.

В примечании стороны \p{Alnum} в точности эквивалентно [A-Za-z0-9] в Java, что не так во всех регулярных выраженияхароматы. Я использовал \p{Alnum}, не только потому, что он короче, но потому что он дает больше защиты от опечаток, таких как [A-z] (что синтаксически верно, но почти наверняка не то, что на самом деле имел в виду автор).

РЕДАКТИРОВАТЬ: Производительность должна быть рассмотрена тоже. Первоначально я включил + после первого \p{Alnum}, но я понял, что это не очень хорошая идея. Если это было частью более длинного регулярного выражения, иРегулярное выражение не совпадает сразу, оно может в конечном итоге тратить много времени на попытки сопоставить те же группы символов с \p{Alnum}+ или [\p{Alnum}\s]*. Впрочем, начальный \s* в порядке, потому что \sне соответствует ни одному из символов, которые соответствуют \p{Alnum}.

1 голос
/ 03 декабря 2010

Любое одно или несколько слов с нулем или несколькими пробелами

\w+\s*
0 голосов
/ 03 декабря 2010

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

\s*\p{Alnum}+\s*
  • \p{Alnum} - буквенно-цифровой символ: [\p{Alpha}\p{Digit}]
  • * говорит "ноль или более раз"
  • + говорит "хотя бы один" (не "или", как вы, кажется, верите, или написано |)
  • | означает «или»
  • \s - символ пробела: [ \t\n\x0B\f\r]

РЕДАКТИРОВАТЬ: Чтобы ответить на комментарии ниже, я хочу, чтобы он принимал строки, содержащие по крайней мере 1 буквенно-цифровой И любое количество (в том числе без) пробелов.

Для предложенного мною шаблона требуется как минимум один буквенно-цифровой символ.

РЕДАКТИРОВАТЬ2: Чтобы уточнить, я не хочу, чтобы любое количество пробелов (включая 0) было принято, если есть хотя бы один буквенно-цифровой символ

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

0 голосов
/ 03 декабря 2010

Эй, попробуйте это ([^\s]+\s*) [^ \ s] означает перехватывать все, что не является пробелом, в то время как \ s * означает, что пробел необязателен (если вы действительно хотите, чтобы хотя бы один пробел был поставлен + вместо ) Редактировать: извините меня, не только буквенно-цифровой (поставить ([a-zA-Z0-9] + \ s ) для буквенно-цифровой)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...