Biểu thức chính quy cho các chữ cái, số và - _


100

Tôi gặp sự cố khi kiểm tra trong PHP nếu một giá trị là bất kỳ kết hợp nào sau đây

  • chữ cái (viết hoa hoặc viết thường)
  • số (0-9)
  • dấu gạch dưới (_)
  • dấu gạch ngang (-)
  • điểm (.)
  • không có khoảng trắng! hoặc các nhân vật khác

một vài ví dụ:

  • OK: "screen123.css"
  • OK: "screen-new-file.css"
  • OK: "screen_new.js"
  • KHÔNG ĐƯỢC: "screen new file.css"

Tôi đoán tôi cần một regex cho điều này, vì tôi cần phải gặp lỗi khi một chuỗi cung cấp có các ký tự khác trong đó ngoài những ký tự được đề cập ở trên.


^ [\ w .-] * $ -> Thao tác này sẽ nhận được tất cả tên tệp.
Badri Gs

Câu trả lời:


207

Mô hình bạn muốn giống như ( xem trên rubular.com ):

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

Giải trình:

  • ^ là đầu của neo dòng
  • $ là phần cuối của ký tự neo
  • [...] là một định nghĩa lớp ký tự
  • * là sự lặp lại "không hoặc nhiều hơn"

Lưu ý rằng dấu gạch ngang chữ -là ký tự cuối cùng trong định nghĩa lớp ký tự, nếu không thì nó có nghĩa khác (tức là phạm vi). Bên .ngoài định nghĩa lớp ký tự cũng có một ý nghĩa khác, nhưng bên trong, nó chỉ là một nghĩa đen.

Người giới thiệu


Trong PHP

Dưới đây là một đoạn mã để chỉ ra cách bạn có thể sử dụng mẫu này:

<?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";
  };
}

?>

Các bản in trên ( như đã thấy trê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!!!

Lưu ý rằng mô hình hơi khác, sử dụng \wthay thế. Đây là lớp ký tự cho "ký tự từ".

Tham chiếu API


Lưu ý về đặc điểm kỹ thuật

Điều này dường như tuân theo đặc điểm kỹ thuật của bạn, nhưng lưu ý rằng điều này sẽ phù hợp với những thứ như ....., v.v., có thể có hoặc có thể không phải những gì bạn mong muốn. Nếu bạn có thể nói rõ hơn mẫu bạn muốn khớp, thì regex sẽ phức tạp hơn một chút.

Regex ở trên cũng khớp với chuỗi trống. Nếu bạn cần ít nhất một ký tự, thì hãy sử dụng +(một hoặc nhiều) thay vì *(0 hoặc nhiều) để lặp lại.

Trong mọi trường hợp, bạn có thể làm rõ thêm thông số kỹ thuật của mình (luôn hữu ích khi đặt câu hỏi regex), nhưng hy vọng rằng bạn cũng có thể học cách tự viết mẫu với thông tin trên.


Xem thêm Ideone.com/5DMCa để biết thông số kỹ thuật khác có thể nhiều hơn những gì bạn muốn. Hãy qua lại với tôi trên rubular nếu bạn muốn cùng tôi phát triển thông số kỹ thuật.
polygenelubricants

Tôi đang sử dụng Tornado và cần nắm bắt các tên html, vì vậy tôi đã sử dụng nó dựa trên câu trả lời của bạn; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon

Tôi sẽ thêm một quy tắc khác đó là: ký tự cuối cùng phải là một chữ và số. Cập nhật Regex:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan

Người dùng Go (golang), hãy lưu ý, mẫu ở đây sẽ dẫn đến falsecác ký tự chuỗi thô trống. Sân chơi . Sử dụng giải pháp của @ nonopolarity bên dưới .
BentCoder

15

bạn có thể dùng

^[\w\d_.-]+$

nghĩa +là đảm bảo rằng nó có ít nhất 1 ký tự. Cần ^$để biểu thị sự bắt đầu và kết thúc, nếu không, nếu chuỗi có khớp ở giữa, chẳng hạn như @@@@xyz%%%%thì nó vẫn là một chuỗi khớp.


3
Đặt -đầu tiên trong tập hợp, để tránh xác định phạm vi. Và \wbao gồm cả chữ và số và gạch dưới. Vì vậy, bạn cần [\w.-]+.
Richard

Cảm ơn, này hoạt động tốt đối với tôi: ^ [\ w \ d _.-] + \ (csv | CSV) $.
Dharam Mali

Điều này cũng tuân theo các ký tự chuỗi thô rỗng của Go (golang) trong khi câu trả lời được chấp nhận thì không nên người dùng Go gắn bó với giải pháp này. Sân chơi
BentCoder

8

Để thực sự che phủ khuôn mẫu của bạn, tức là tên tệp hợp lệ theo quy tắc của bạn, tôi nghĩ rằng bạn cần nhiều hơn một chút. Lưu ý rằng điều này không khớp với tên tệp hợp pháp từ góc độ hệ thống . Điều đó sẽ phụ thuộc vào hệ thống và tự do hơn trong những gì nó chấp nhận. Điều này nhằm mục đích phù hợp với các mẫu có thể chấp nhận được của bạn.

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

Giải trình:

  • ^Khớp với phần đầu của một chuỗi. Điều này (cộng với kết quả phù hợp) buộc chuỗi phải tuân theo biểu thức chính xác, không chỉ chứa một chuỗi con phù hợp với biểu thức.
  • ([a-zA-Z0-9]+[_-])*Không hoặc nhiều lần xuất hiện của một hoặc nhiều chữ cái hoặc số theo sau bởi dấu gạch dưới hoặc dấu gạch ngang. Điều này làm cho tất cả các tên chứa dấu gạch ngang hoặc dấu gạch dưới có các chữ cái hoặc số giữa chúng.
  • [a-zA-Z0-9]+Một hoặc nhiều chữ cái hoặc số. Điều này bao gồm tất cả các tên không chứa dấu gạch dưới hoặc dấu gạch ngang.
  • \.Một dấu chấm theo nghĩa đen. Buộc tên tệp phải có phần mở rộng và bằng cách loại trừ khỏi phần còn lại của mẫu, chỉ cho phép khoảng thời gian được sử dụng giữa tên và phần mở rộng. Nếu bạn muốn nhiều tiện ích mở rộng có thể được xử lý tốt bằng cách sử dụng kỹ thuật tương tự như đối với dấu gạch ngang / dấu gạch dưới, chỉ cần ở cuối.
  • [a-zA-Z0-9]+Một hoặc nhiều chữ cái hoặc số. Phần mở rộng phải dài ít nhất một ký tự và chỉ được chứa các chữ cái và số. Điều này là điển hình, nhưng nếu bạn muốn cho phép dấu gạch dưới, điều đó cũng có thể được giải quyết. Bạn cũng có thể cung cấp phạm vi độ dài {2,3}thay vì một hoặc nhiều đối sánh +, nếu điều đó phù hợp hơn.
  • $Khớp phần cuối của chuỗi. Xem ký tự bắt đầu.

6

Đây là mẫu bạn đang tìm kiếm

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

Điều này có nghĩa là:

  • ^ Bắt đầu chuỗi
  • [...] Khớp các ký tự bên trong
  • \w Bất kỳ ký tự từ nào cũng vậy 0-9 a-z A-Z
  • -_.Đối sánh -_.
  • * Không hoặc nhiều mẫu hoặc không giới hạn
  • $ Kết thúc chuỗi

Nếu bạn muốn giới hạn số lượng ký tự:

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

{0,5}Có nghĩa là 0-5ký tự


var a = / ^ \ w * $ / g a.test ("46545") và kết quả là sai
Dipak

1
Chú ý rằng \wbao gồm_
hxpax

4

Một cái gì đó như thế này sẽ hoạt động

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

Điều này sẽ lặp lại "không hợp lệ"


2

[A-Za-z0-9_.-]*

Điều này cũng sẽ phù hợp với các chuỗi trống, nếu bạn không muốn trao đổi cuối cùng *cho một+

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.