2013-08-15 36 views
5

Tôi có một số chuỗi mà tôi muốn xóa bằng cách xóa tất cả các ký tự không phải chữ và số từ đầu và cuối.Làm thế nào để cắt tất cả các ký tự không phải chữ và số từ đầu và cuối chuỗi trong Javascript?

Nó sẽ làm việc trên các dây:

)&*@^#*^#&^%$text-is.clean,--^2*%#**)(#&^ --->> text-is.clean,--^2 

[email protected]#$%,.-"^&[email protected],--^#*%#**)(#&^ --->> [email protected] 

Tôi có regex này, mà loại bỏ chúng ra khỏi toàn bộ chuỗi:

val.replace(/[^a-zA-Z0-9]/g,'') 

Làm thế nào tôi có thể thay đổi nó để chỉ loại bỏ ngay từ đầu và kết thúc chuỗi?

+0

Không, đó là một ví dụ không đúng, tôi đã sửa nó. –

Trả lời

6

Sửa đổi RegExp hiện tại của bạn để chỉ định bắt đầu hoặc kết thúc chuỗi với ^ hoặc $ và làm cho nó tham lam. Sau đó, bạn có thể liên kết cả hai với một OR |.

val.replace(/^[^a-zA-Z0-9]*|[^a-zA-Z0-9]*$/g, ''); 

này có thể được đơn giản hóa để a-z với i cờ cho tất cả các chữ cái và \d cho số

val.replace(/^[^a-z\d]*|[^a-z\d]*$/gi, ''); 
+0

Tốt hơn để sử dụng định lượng '+' thay vì '*'. Tại sao lại không thay thế gì cả? – ridgerunner

4

Bạn cần phải sử dụng neo - ^$. Và cũng có thể, bạn sẽ cần một lượng hóa - *:

val.replace(/^[^a-zA-Z0-9]*|[^a-zA-Z0-9]*$/g,'') 
4

Sử dụng neo để phù hợp với sự khởi đầu và kết thúc của chuỗi:

val.replace(/^[^A-Z0-9]+|[^A-Z0-9]+$/ig, '') 
+1

Regex thứ hai của bạn sẽ không hoạt động giống như lần đầu tiên. Nó sẽ không khớp '@' ở giữa, mà OP muốn. –

+0

@RohitJain: Vâng, bạn nói đúng. – Blender

+0

+1 để sử dụng định lượng '+' thay vì '*'. (Nó không có ý nghĩa để thay thế các ký tự không có gì và không hiệu quả.) – ridgerunner

1

Sử dụng neo ^$ để phù hợp với vị trí trước khi ký tự đầu tiên và sau ký tự cuối cùng trong chuỗi.

val.replace(/(^[^A-Za-z0-9]*)|([^A-Za-z0-9]*$)/g, ''); 

Bạn cũng có thể rút ngắn mã của bạn sử dụng \W có nghĩa là nhân vật phi tự chữ và số, phím tắt cho [^a-zA-Z0-9_] trong trường hợp bạn muốn giữ lại gạch là tốt.

val.replace(/(^\W*)|(\W*$)/g, ''); 
Các vấn đề liên quan