\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}
.