Regex, mọi ký tự không chữ và số trừ khoảng trắng hoặc dấu hai chấm


131

Làm thế nào tôi có thể làm điều này bất cứ nơi nào?

Về cơ bản, tôi đang cố gắng khớp tất cả các loại ký tự linh tinh như ký hiệu, dấu chấm phẩy, ký hiệu đô la, v.v.


13
/[^a-zA-Z0-9\s\:]*/
Kelly

Câu trả lời:


246
[^a-zA-Z\d\s:]
  • \ d - lớp số
  • \ s - khoảng trắng
  • a-zA-Z - khớp với tất cả các chữ cái
  • ^ - phủ nhận tất cả - vì vậy bạn nhận được - ký tự không phải là số, không khoảng trắng và không dấu hai chấm

Đó cũng là những gì tôi đang xem :)) - Tôi phải quảng bá câu trả lời hoàn hảo của bạn
Tudor Constantin

6
Điều duy nhất tôi tìm thấy là điều này loại bỏ các ký tự đặc biệt như é hoặc ã. Tôi thích [^ \ w \ d \ s:].
Eric Belair

5
Bị từ chối vì điều này sẽ không bắt được các ký tự không phải là tiếng Latinh, cũng không phải là các ký tự Latinh "đặc biệt".
damian

\d\sphần mở rộng Perl mà thường không được hỗ trợ bởi các công cụ lớn tuổi thích grep, sed, tr, lexvv
tripleee

38

Điều này nên làm điều đó:

[^a-zA-Z\d\s:]

1
Phần còn lại hoặc kiểm tra không gian nhưng không phải khoảng trắng hoặc có phủ định ở vị trí sai để thực sự phủ định.
Zachary Scott

\ w cũng bắt được dấu gạch dưới - đó là một ký tự không phải là chữ và số
Tudor Constantin

Aha! Tôi sẽ sửa đổi - tôi không biết điều đó. Tôi hy vọng nó hoạt động khác nhau cho các động cơ khác nhau, nhưng cũng có thể cung cấp cho OP câu trả lời an toàn.
Luke Sneeringer

2
Bị từ chối vì điều này sẽ không bắt được các ký tự không phải là tiếng Latinh, cũng không phải là các ký tự Latinh "đặc biệt".
damian

16

Nếu bạn muốn coi các ký tự Latin có dấu (ví dụ: à) là các chữ cái bình thường (nghĩa là tránh khớp chúng quá), bạn cũng cần đưa phạm vi Unicode thích hợp ( \ u00C0- \ u00FF ) vào biểu thức chính của mình, vì vậy, nó sẽ trông như thế này:

/[^a-zA-Z\d\s:\u00C0-\u00FF]/g
  • ^ phủ nhận những gì sau
  • a-zA-Z khớp chữ hoa và chữ thường
  • \d khớp chữ số
  • \s khớp với khoảng trắng (nếu bạn chỉ muốn khớp các khoảng trắng, thay thế khoảng trắng này bằng khoảng trắng)
  • : phù hợp với một dấu hai chấm
  • \u00C0-\u00FF phù hợp với phạm vi Unicode cho các ký tự Latin có dấu.

nb. Kết hợp phạm vi Unicode có thể không hoạt động đối với tất cả các công cụ regex, nhưng ở trên chắc chắn hoạt động trong Javascript (như đã thấy trong bút này trên Codepen).

nb2. Nếu bạn không bận tâm về việc khớp dấu gạch dưới, bạn có thể thay thế a-zA-Z\dbằng \w, khớp với chữ cái, chữ số và dấu gạch dưới.


Phạm vi này chứa một số ký tự không phải là chữ và số (U + 00D7 và U + 00F7) và loại trừ rất nhiều ký tự có dấu hợp lệ từ các ngôn ngữ ngoài phương Tây như tiếng Ba Lan, tiếng Séc, tiếng Việt, v.v.
tripleee

1
Nâng cấp cho mô tả của từng phần của RegEx.
morajabi

14

Thử cái này:

[^a-zA-Z0-9 :]

Ví dụ về JavaScript:

"!@#$%* ABC def:123".replace(/[^a-zA-Z0-9 :]/g, ".")

Xem một ví dụ trực tuyến:

http://jsfiddle.net/vhMy8/


3
Bị từ chối vì điều này sẽ không bắt được các ký tự không phải là tiếng Latinh, cũng không phải là các ký tự Latinh "đặc biệt".
damian

14
Thật dễ dàng để bỏ phiếu một câu trả lời, và khó khăn hơn để cung cấp thông tin mang tính xây dựng cho hội đồng quản trị, ví dụ như làm thế nào để người ta bắt các ký tự không phải là tiếng Latinh, cũng không phải là các ký tự Latinh "đặc biệt"? Theo tính toán của tôi ở đây, bạn đã bỏ phiếu 3 câu trả lời cho cùng một lý do, và theo tôi cho một điều chỉnh khá nhỏ. Ví dụ, tôi ở đây để tìm một biểu thức chính xác cho những gì được thảo luận trong các câu trả lời này. Tôi không quan tâm đến các bộ ký tự sẽ không được sử dụng trong ứng dụng của tôi. Luật lợi nhuận giảm dần.

Aaron có thể là một "tinh chỉnh nhỏ" đối với một công dân Hoa Kỳ, nhưng rất phù hợp với ... phần còn lại của hành tinh này.
Michael K. Borregaard

4

Không có chữ và số, khoảng trắng hoặc '_'.

var reg = /[^\w\s)]|[_]/g;

4

Nếu bạn có nghĩa là "ký tự không chữ và số", hãy thử sử dụng:

var reg =/[^a-zA-Z0-9]/g      //[^abc]

1

Regex này hoạt động cho C # , PCREGo để đặt tên cho một số.

Nó không hoạt động với JavaScript trên Chrome theo những gì RegexBuddy nói. Nhưng đã có một ví dụ cho điều đó ở đây.

Phần chính của điều này là:

\p{L}

đại diện \p{L}hoặc \p{Letter}bất kỳ loại thư từ bất kỳ ngôn ngữ nào.


Bản thân regex đầy đủ: [^\w\d\s:\p{L}]

Ví dụ: https://regex101.com/r/K59PrA/2


Đây là câu trả lời duy nhất ở đây liên quan chính xác đến bảng chữ cái có dấu Unicode theo cách thích hợp. Đáng buồn thay, không phải tất cả các công cụ regex đều hỗ trợ cơ sở này (ngay cả Python cũng thiếu nó, kể từ 3.8, mặc dù công cụ regex của nó dựa trên PCRE bề ngoài).
tripleee

1
Tôi sẽ xóa Python khỏi câu trả lời, tôi nghĩ tôi đã kiểm tra nhưng dường như không. Cảm ơn đã chỉ ra rằng.
Ste

0

Hãy thử thêm điều này:

^[^a-zA-Z\d\s:]*$

Điều này đã làm việc cho tôi ... :)


Điều này dường như lặp lại câu trả lời được chấp nhận từ năm 2011. Các neo ^$giới hạn nó phù hợp với toàn bộ các dòng và bộ *định lượng có nghĩa là nó cũng khớp với các dòng trống.
tripleee

0

Trong JavaScript:

/[^\w_]/g

^phủ định, tức là chọn bất cứ thứ gì không có trong tập hợp sau

\w bất kỳ ký tự từ nào (nghĩa là bất kỳ ký tự chữ và số nào, cộng với dấu gạch dưới)

_ phủ định dấu gạch dưới, vì nó được coi là một ký tự 'từ'

Ví dụ sử dụng - const nonAlphaNumericChars = /[^\w_]/g;

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.