Жаль, что разные движки регулярных выражений имеют разные средства для сопоставления буквенно-цифровых символов. Подобный вопрос (довольно расплывчатый, без указания языка / регулярного выражения) требует очень длинного или, по крайней мере, очень организованного ответа, касающегося каждого варианта.
Wiktor Stribi'ew
Ответы:
939
Чтобы сопоставить строку, содержащую только эти символы (или пустую строку), попробуйте
"^[a-zA-Z0-9_]*$"
Это работает для регулярных выражений .NET и, возможно, для многих других языков.
Разбивая это:
^: start ofstring[: beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9: any digit
_ : underscore
]:endof character group*: zero or more of the given characters
$ :endofstring
Если вы не хотите разрешать пустые строки, используйте + вместо *.
Как уже отмечали другие, некоторые языки регулярных выражений имеют сокращенную форму для [a-zA-Z0-9_]. В языке регулярных выражений .NET вы можете включить поведение ECMAScript и использовать его \wкак сокращение (уступая ^\w*$или ^\w+$). Обратите внимание, что в других языках, и по умолчанию в .NET, \wон несколько шире и будет соответствовать другим видам символов Юникода (спасибо Яну за указание на это). Поэтому, если вы действительно хотите сопоставить только эти символы, лучше использовать явную (более длинную) форму.
Если вы когда-нибудь поедете в Германию или когда-нибудь увидите какой-нибудь немецкий текст, вы поймете, что я говорю.
Windows программист
30
\ w и [A-Za-z0-9_] не эквивалентны в большинстве разновидностей регулярных выражений. \ w включает в себя буквы с диакритическими знаками, письма из других сценариев и т. д.
Ян Гойваертс
4
В первоначальном вопросе говорилось «прописные и строчные буквы», поэтому казалось бы, что «буквы» из нелатинских алфавитов должны совпадать.
Трейказ
3
[\p{upper}\p{lower}\p{gc=Number}_]это все, что вам нужно, чтобы сделать это правильно, при условии, что нет комбинирующих символов.
tchrist
1
Похоже, что preg_match требует, чтобы ваш шаблон был заключен в разделители, которые обычно являются косыми чертами. Поэтому вам понадобится "/ ^ [a-zA-Z0-9 _] * $ /". См. Этот вопрос для получения дополнительной информации: stackoverflow.com/questions/6445133/… . Смотрите также эту страницу: forums.phpfreaks.com/topic/…
Чарли
346
Здесь много многословия, и я категорически против, поэтому мой окончательный ответ:
/^\w+$/
\wэквивалентно [A-Za-z0-9_], что в значительной степени то, что вы хотите. (если мы не введем юникод в микс)
Используя +квантификатор, вы сопоставите один или несколько символов. Если вы также хотите принять пустую строку, используйте *вместо этого.
Английский не единственный язык в мире, поэтому это должен быть принятый ответ, а не [a-z]его варианты. \wбудет захватывать нелатинские символы тоже. Нравится šēēāиликукареку
Alex
1
Утверждено на странице 318 О'Рейли "Освоение регулярных выражений"
guidotex
36
Вы хотите убедиться, что каждый символ соответствует вашим требованиям, поэтому мы используем:
[A-Za-z0-9_]
И вы даже можете использовать сокращенную версию:
\w
Что эквивалентно (в некоторых разновидностях регулярных выражений, поэтому обязательно проверьте, прежде чем использовать его). Затем, чтобы указать, что вся строка должна совпадать, вы используете:
^
Чтобы указать, что строка должна начинаться с этого символа, затем используйте
$
Чтобы указать, строка должна заканчиваться этим символом. Тогда используйте
\w+or \w*
Для обозначения «1 или более» или «0 или более». Собрав все это вместе, мы имеем:
\ w и [A-Za-z0-9_] не эквивалентны в большинстве разновидностей регулярных выражений. \ w включает в себя буквы с диакритическими знаками, письма из других сценариев и т. д.
Ян Гойваертс
32
Гм ... вопрос: нужно ли хотя бы один символ или нет? Это может быть пустая строка?
^[A-Za-z0-9_]+$
Подойдет хотя бы один верхний или нижний регистр буквенно-цифровой или подчеркивания. Если это может быть нулевая длина, тогда просто замените + на *
^[A-Za-z0-9_]*$
Редактировать:
Если необходимо включить диакритические знаки (например, cedilla - ç), вам необходимо использовать символ слова, который соответствует описанному выше, но содержит диакритические знаки:
Однако, хотя в документации по ссылкам выше указано, что « \wбудет соответствовать любой символ в диапазоне 0–9, A - Z и a - z (эквивалент POSIX [: alnum:])», я не нашел, что это правда , Во grep -Pвсяком случае, не с . Вы должны явно включить подчеркивание, если вы используете, [:alnum:]но не если вы используете \w. Вы не можете победить следующее коротко и сладко:
^\w+$
Наряду с удобочитаемостью, использование классов символов POSIX ( http://www.regular-expressions.info/posixbrackets.html ) означает, что ваше регулярное выражение может работать со строками, не относящимися к ASCII, а регулярные выражения на основе диапазона не будут работать, поскольку они полагаются на регулярные выражения. базовый порядок символов ASCII, который может отличаться от других наборов символов и поэтому будет исключать некоторые не-ASCII символы (буквы, такие как œ), которые вы, возможно, захотите захватить.
В информатике буквенно-цифровое значение часто означает, что первый символ не является числом, а представляет собой алфавит или подчеркивание. После этого персонаж может быть 0-9, A-Z, a-zили подчеркивание ( _).
Как бы мы поступили, если хотим добавить _ и - в список?
Рахи
10
Попробуйте эти многоязычные расширения, которые я сделал для строки.
IsAlphaNumeric - строка должна содержать по крайней мере 1 альфа (буква в диапазоне Unicode, указанная в charSet) и по крайней мере 1 номер (указанная в numSet). Также строка должна содержать только буквы и цифры.
IsAlpha - строка должна содержать как минимум 1 альфа (на указанном языке charSet) и содержать только альфа.
IsNumeric - строка должна содержать как минимум 1 число (на указанном языке numSet) и содержать только цифры.
Диапазон charSet / numSet для желаемого языка может быть указан. Диапазоны Unicode доступны по ссылке ниже:
//Englishstring test ="AASD121asf";//Greek//string test = "Ϡϛβ123";//Bengali//string test = "শর৩৮";//Hindi//string test = @"क़लम३७ख़";bool isAlphaNum = test.IsAlphaNumeric();
@Shah: я добавил только алфавиты (и только цифры тоже).
Шантану
8
Следующее регулярное выражение соответствует буквенно-цифровым символам и подчеркиванию:
^[a-zA-Z0-9_]+$
Например, в Perl:
#!/usr/bin/perl -wmy $arg1 = $ARGV[0];# check that the string contains *only* one or more alphanumeric chars or underscoresif($arg1 !~/^[a-zA-Z0-9_]+$/){print"Failed.\n";}else{print"Success.\n";}
Шаблон в вашем коде правильный, но шаблон выше проверяет только один экземпляр.
BenAlabaster
Это было сделано намеренно, пример кода был задуман как поясняющее использование при проверке строки. Кроме того, почему в коде есть маркеры начала и конца строки, которых нет в примере с регулярным выражением.
Джей
1
@Windows programmer - en.wikipedia.org/wiki/Alphanumeric - латинский алфавит , а не «латинский набор символов», который включает в себя диакритические знаки и т. Д. Чисто проблема семантики, но я лично согласен с распространенным использованием термина алфавитно-цифровой как AZ и 0-9.
Джей
2
- буква алфавита на испанском языке, в том числе в Латинской Америке.
Windows программист
2
«Я хотел бы иметь регулярное выражение, которое проверяет, содержит ли строка только прописные и строчные буквы, цифры и подчеркивания», не ограничивает его латинскими буквами. «Следующее регулярное выражение соответствует буквенно-цифровым символам и подчеркиванию» не ограничивает его латинскими буквами. «^ [a-zA-Z0-9 _] + $» завершается ошибкой.
В первоначальном вопросе не было требования, чтобы письмо присутствовало.
Дмитрий Кузьминов
О каком письме ты говоришь? Мое регулярное выражение содержит тот, который задан в вопросе. Алфавиты, цифры, подчеркивание
Чинмая Пати
1234это слово из языка , запрошенного автором. Ваш язык более строгий.
Дмитрий Кузьминов
4
Для меня возникла проблема, заключающаяся в том, что я хочу провести различие между буквенно-цифровым и буквенно-цифровым, поэтому для обеспечения того, чтобы буквенно-цифровая строка содержала хотя бы одну букву и хотя бы одну цифру, я использовал:
Если вы просто хотите, чтобы латынь делала p {Latin} вместо p {L}
Агустин
2
Я полагаю, что вы не принимаете символы латиницы и Юникода в своих матчах. Например, если вам нужно использовать символы «ã» или «ü», использование «\ w» не сработает.
Это работает для меня, нашел это в "Освоение регулярных выражений" О'Рейли:
/^\w+$/
Объяснение:
^ устанавливает позицию в начале строки
\ w + соответствует любому символу слова (равен [a-zA-Z0-9_])
«+» Quantifier - Сопоставляет от одного до неограниченного количества раз, столько раз, сколько возможно, возвращая при необходимости (жадный)
$ устанавливает позицию в конце строки
Проверьте себя:
const regex =/^\w+$/;const str =`nut_cracker_12`;let m;if((m = regex.exec(str))!==null){// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex)=>{
console.log(`Found match, group ${groupIndex}: ${match}`);});}
Ответы:
Чтобы сопоставить строку, содержащую только эти символы (или пустую строку), попробуйте
Это работает для регулярных выражений .NET и, возможно, для многих других языков.
Разбивая это:
Если вы не хотите разрешать пустые строки, используйте + вместо *.
Как уже отмечали другие, некоторые языки регулярных выражений имеют сокращенную форму для
[a-zA-Z0-9_]
. В языке регулярных выражений .NET вы можете включить поведение ECMAScript и использовать его\w
как сокращение (уступая^\w*$
или^\w+$
). Обратите внимание, что в других языках, и по умолчанию в .NET,\w
он несколько шире и будет соответствовать другим видам символов Юникода (спасибо Яну за указание на это). Поэтому, если вы действительно хотите сопоставить только эти символы, лучше использовать явную (более длинную) форму.источник
[\p{upper}\p{lower}\p{gc=Number}_]
это все, что вам нужно, чтобы сделать это правильно, при условии, что нет комбинирующих символов.Здесь много многословия, и я категорически против, поэтому мой окончательный ответ:
\w
эквивалентно[A-Za-z0-9_]
, что в значительной степени то, что вы хотите. (если мы не введем юникод в микс)Используя
+
квантификатор, вы сопоставите один или несколько символов. Если вы также хотите принять пустую строку, используйте*
вместо этого.источник
\w
обычно не ограничивается только ASCII.[a-z]
его варианты.\w
будет захватывать нелатинские символы тоже. Нравитсяšēēā
иликукареку
Вы хотите убедиться, что каждый символ соответствует вашим требованиям, поэтому мы используем:
И вы даже можете использовать сокращенную версию:
Что эквивалентно (в некоторых разновидностях регулярных выражений, поэтому обязательно проверьте, прежде чем использовать его). Затем, чтобы указать, что вся строка должна совпадать, вы используете:
Чтобы указать, что строка должна начинаться с этого символа, затем используйте
Чтобы указать, строка должна заканчиваться этим символом. Тогда используйте
Для обозначения «1 или более» или «0 или более». Собрав все это вместе, мы имеем:
источник
Гм ... вопрос: нужно ли хотя бы один символ или нет? Это может быть пустая строка?
Подойдет хотя бы один верхний или нижний регистр буквенно-цифровой или подчеркивания. Если это может быть нулевая длина, тогда просто замените + на *
Редактировать:
Если необходимо включить диакритические знаки (например, cedilla - ç), вам необходимо использовать символ слова, который соответствует описанному выше, но содержит диакритические знаки:
Или
источник
Хотя это более многословно
\w
, я лично ценю удобочитаемость полных имен классов символов POSIX ( http://www.zytrax.com/tech/web/regex.htm#special ), поэтому я бы сказал:Однако, хотя в документации по ссылкам выше указано, что «
\w
будет соответствовать любой символ в диапазоне 0–9, A - Z и a - z (эквивалент POSIX [: alnum:])», я не нашел, что это правда , Воgrep -P
всяком случае, не с . Вы должны явно включить подчеркивание, если вы используете,[:alnum:]
но не если вы используете\w
. Вы не можете победить следующее коротко и сладко:Наряду с удобочитаемостью, использование классов символов POSIX ( http://www.regular-expressions.info/posixbrackets.html ) означает, что ваше регулярное выражение может работать со строками, не относящимися к ASCII, а регулярные выражения на основе диапазона не будут работать, поскольку они полагаются на регулярные выражения. базовый порядок символов ASCII, который может отличаться от других наборов символов и поэтому будет исключать некоторые не-ASCII символы (буквы, такие как œ), которые вы, возможно, захотите захватить.
источник
В информатике буквенно-цифровое значение часто означает, что первый символ не является числом, а представляет собой алфавит или подчеркивание. После этого персонаж может быть
0-9
,A-Z
,a-z
или подчеркивание (_
).Вот как вы это сделаете:
Протестировано под php:
или возьми это
и поместите его на свой язык разработки.
источник
Как насчет:
... если вы хотите быть явным, или:
... если вы предпочитаете сжатый (синтаксис Perl).
источник
используйте Lookaheads, чтобы сделать «хотя бы один» материал. Поверь мне, это намного проще.
Вот пример, который потребовал бы 1-10 символов, содержащих по крайней мере одну цифру и одну букву:
ПРИМЕЧАНИЕ: мог бы использовать \ w, но тогда вступают в силу соображения ECMA / Unicode, увеличивающие охват символов \ w «символ слова».
источник
Попробуйте эти многоязычные расширения, которые я сделал для строки.
IsAlphaNumeric - строка должна содержать по крайней мере 1 альфа (буква в диапазоне Unicode, указанная в charSet) и по крайней мере 1 номер (указанная в numSet). Также строка должна содержать только буквы и цифры.
IsAlpha - строка должна содержать как минимум 1 альфа (на указанном языке charSet) и содержать только альфа.
IsNumeric - строка должна содержать как минимум 1 число (на указанном языке numSet) и содержать только цифры.
Диапазон charSet / numSet для желаемого языка может быть указан. Диапазоны Unicode доступны по ссылке ниже:
http://www.ssec.wisc.edu/~tomw/java/unicode.html
API:
Применение :
источник
Следующее регулярное выражение соответствует буквенно-цифровым символам и подчеркиванию:
Например, в Perl:
источник
Это должно работать в большинстве случаев.
/^[\d]*[a-z_][a-z\d_]*$/gi
И под большинством я имею в виду,
объяснение
^ ... $
- сопоставить шаблон, начинающийся и заканчивающийся[\d]*
- соответствовать нулю или более цифр[a-z_]
- соответствовать алфавиту или подчеркиванию[a-z\d_]*
- соответствовать алфавиту или цифре или подчеркиванию/gi
- сопоставлять глобально через строку и без учета регистраисточник
1234
это слово из языка , запрошенного автором. Ваш язык более строгий.Для меня возникла проблема, заключающаяся в том, что я хочу провести различие между буквенно-цифровым и буквенно-цифровым, поэтому для обеспечения того, чтобы буквенно-цифровая строка содержала хотя бы одну букву и хотя бы одну цифру, я использовал:
источник
Вот регулярное выражение для того, что вы хотите с квантификатором, чтобы указать не менее 1 символа и не более 255 символов
источник
Для тех из вас, кто ищет буквенно-цифровые соответствия в юникоде, вы можете сделать что-то вроде:
Дополнительная информация на http://unicode.org/reports/tr18/ и на http://www.regular-expressions.info/unicode.html.
источник
Я полагаю, что вы не принимаете символы латиницы и Юникода в своих матчах. Например, если вам нужно использовать символы «ã» или «ü», использование «\ w» не сработает.
Вы также можете использовать этот подход:
Надеюсь, поможет!
источник
Чтобы проверить всю строку и не допустить пустых строк, попробуйте
источник
^\w*$
будет работать для следующих комбинацийисточник
это работает для меня, вы можете попробовать
источник
Это работает для меня, нашел это в "Освоение регулярных выражений" О'Рейли:
Объяснение:
Проверьте себя:
источник