Регулярний вираз для букв, цифр та - _


100

У мене проблеми з перевіркою в PHP, якщо значення є будь-якою з наступних комбінацій

  • літери (великі або малі)
  • цифри (0-9)
  • підкреслення (_)
  • тире (-)
  • точка (.)
  • без пробілів! або інші символи

кілька прикладів:

  • ОК: "screen123.css"
  • Добре: "screen-new-file.css"
  • Добре: "screen_new.js"
  • NOT NOT: "screen new file.css"

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


^ [\ w .-] * $ -> Це отримає всю назву файлу.
Badri Gs

Відповіді:


207

Шаблон, який ви хочете, є приблизно таким ( див. Його на rubular.com ):

^[a-zA-Z0-9_.-]*$

Пояснення:

  • ^ - це початок прив’язки лінії
  • $ - кінець прив’язки лінії
  • [...] - це визначення класу символів
  • * є "нульовим або більше" повторенням

Зауважте, що літерал-тире -є останнім символом у визначенні класу символів, інакше він має інше значення (тобто діапазон). Це .також має різне значення поза визначенням класів символів, але всередині це просто літерал.

Список літератури


У PHP

Ось фрагмент, щоб продемонструвати, як можна використовувати цей шаблон:

<?php

$arr = array(
  'screen123.css',
  'screen-new-file.css',
  'screen_new.js',
  'screen new file.css'
);

foreach ($arr as $s) {
  if (preg_match('/^[\w.-]*$/', $s)) {
    print "$s is a match\n";
  } else {
    print "$s is NO match!!!\n";
  };
}

?>

Наведені вище відбитки ( як видно на ideone.com ):

screen123.css is a match
screen-new-file.css is a match
screen_new.js is a match
screen new file.css is NO match!!!

Зверніть увагу, що шаблон трохи відрізняється, використовуючи \wзамість цього. Це клас символів для "символу слова".

Посилання на API


Примітка щодо специфікації

Здається, це відповідає вашим специфікаціям, але зауважте, що це буде відповідати таким речам, як .....тощо, що може бути чи не тим, що ви бажаєте. Якщо ви можете конкретніше визначити, якому шаблону ви хочете відповідати, регулярний вираз буде дещо складнішим.

Наведений вище регулярний вираз також відповідає порожньому рядку. Якщо вам потрібен хоча б один символ, тоді використовуйте +(один або більше) замість *(нуль або більше) для повторення.

У будь-якому випадку, ви можете додатково уточнити свою специфікацію (завжди допомагає, коли задаєте питання про регулярний вираз), але, сподіваємось, ви також можете навчитися писати шаблон самостійно, враховуючи вищезазначену інформацію.


Дивіться також ideone.com/5DMCa для іншої специфікації, яка може бути більшою, ніж ви хочете. Повертайтесь туди-сюди зі мною на rubular, якщо хочете розробити специфікацію зі мною.
полігенмастильні матеріали

Я використовую Tornado, і мені потрібно захопити імена html, тому я використав це на основі вашої відповіді; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon

Я б додав ще одне правило, яке звучить так: останній символ повинен бути буквено-цифровим. Оновлений регулярний вираз:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Горган

Перехід (golang) користувачів, heads up, шаблон тут призведе falseдо порожніх необроблених літеральних рядків. Дитячий майданчик . Використовуйте рішення @ nonopolarity нижче .
BentCoder

15

ви можете використовувати

^[\w\d_.-]+$

+щоб переконатися , що він має , по крайней мере , 1 символ. Потрібно ^і, $щоб позначити початок і кінець, інакше якщо рядок має збіг посередині, наприклад, @@@@xyz%%%%це все одно збіг.


3
Помістіть -перше в наборі, щоб не визначити діапазон. І \wохоплює буквено-цифрові та підкреслення. Тож вам потрібно [\w.-]+.
Річард

Дякую, у мене це чудово працює: ^ [\ w \ d _.-] + \. (Csv | CSV) $
Дхарам Малі,

Це також відповідає порожнім необробленим літералам Go (golang), тоді як прийнята відповідь не означає, що користувачі Go дотримуються цього рішення. Дитячий майданчик
BentCoder

8

Щоб насправді охопити ваш шаблон, тобто дійсні назви файлів відповідно до ваших правил, я думаю, що вам потрібно трохи більше. Зверніть увагу, що це не відповідає юридичним іменам файлів з точки зору системи . Це було б залежним від системи та більш ліберальним у тому, що він приймає. Це призначено для відповідності вашим прийнятним шаблонам.

^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$

Пояснення:

  • ^Відповідає початку рядка. Це (плюс кінцевий збіг) змушує рядок відповідати точному виразу, а не просто містити підрядок, що відповідає виразу.
  • ([a-zA-Z0-9]+[_-])*Нуль або більше випадків входження однієї або декількох букв або цифр, за якими слід підкреслення або тире. Це призводить до того, що між іменами, що містять тире або підкреслення, є букви або цифри.
  • [a-zA-Z0-9]+Одна або кілька букв або цифр. Це охоплює всі імена, які не містять підкреслення чи тире.
  • \.Буквальний період (крапка). Змушує ім’я файлу мати розширення і, виключаючи з решти шаблону, дозволяти використовувати лише період між іменем та розширенням. Якщо вам потрібне більше одного розширення, яке можна було б обробити за допомогою тієї ж техніки, що і для тире / підкреслення, лише в кінці.
  • [a-zA-Z0-9]+Одна або кілька букв або цифр. Розширення має містити принаймні один символ і містити лише букви та цифри. Це типово, але якщо ви хочете дозволити підкреслення, це можна також вирішити. Ви також можете вказати діапазон довжини {2,3}замість одного або кількох +збігів, якщо це було б більш доречним.
  • $Зіставте кінець рядка. Дивіться початкового символа.

6

Це шаблон, який ви шукаєте

/^[\w-_.]*$/

Що це означає:

  • ^ Початок рядка
  • [...] Зіставте символи всередині
  • \w Будь-який символ слова так 0-9 a-z A-Z
  • -_.Матч -та _і.
  • * Нуль або більше шаблону або необмежений
  • $ Кінець рядка

Якщо ви хочете обмежити кількість символів:

/^[\w-_.]{0,5}$/

{0,5}Означає 0-5символи


var a = / ^ \ w * $ / g a.test ("46545"), і результат був помилковим
Діпак

1
Зверніть увагу, що \wвключає_
hxpax

4

Щось подібне має спрацювати

$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
    echo "not valid";
}

Це буде луною "недійсним"


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.