2009-02-09 62 views
7

gì là cách tốt nhất để loại bỏ tất cả các ký tự đặc biệt từ một chuỗi - như thế này:Xóa ký tự không phải số và không phải ký tự khỏi một chuỗi?

@ # $%^& *() {} |:!?. "> <, /; '[] \ = -

Các mặt hàng có những nhân vật này lấy ra thà ngắn, vì vậy nó sẽ là tốt hơn để sử dụng regex trên mỗi hoặc chỉ sử dụng chuỗi thao tác

Thx

Môi trường == C#/NET

?.

Trả lời

3

trong php:

$tests = array(
    'hello, world!' 
    ,'this is a test' 
    ,'and so is this' 
    ,'another test with /slashes/ & (parenthesis)' 
    ,'l3375p34k stinks' 
); 

function strip_non_alphanumerics($subject) 
{ 
    return preg_replace('/[^a-z0-9]/i', '', $subject); 
} 

foreach($tests as $test) 
{ 
    printf("%s\n", strip_non_alphanumerics($test)); 
} 

đầu ra sẽ là:

helloworld 
thisisatest 
andsoisthis 
anothertestwithslashesparenthesis 
l3375p34kstinks 
+0

Tôi có thể thêm một số trường hợp thử nghiệm với chữ in hoa. –

+0

@jm: đó là một điều tốt quá, tôi đã quá lười biếng để gõ bất kỳ và "i" theo regex làm cho các trường hợp regex-insensitive;) – Kris

+0

P.S. Tại sao đây là câu trả lời được chấp nhận nếu câu hỏi bây giờ tuyên bố môi trường là .NET? (Tôi không nghĩ rằng nó đã làm khi tôi trả lời). Nó sẽ không quá khác biệt về khái niệm trong ví dụ C#, nhưng sẽ không giống như thế này. – Kris

0

Chúng tôi lệnh "tr"?

Bạn không nói những gì môi trường bạn đang ở trong ... vỏ? Chương trình C? Java? Mỗi người trong số đó sẽ có các giải pháp tốt nhất khác nhau.

6

Nói chung tốt hơn nên có danh sách trắng hơn danh sách cấm.

Regex có \w thuận tiện, có nghĩa là chữ số và dấu gạch dưới (một số biến thể cũng thêm ký tự có dấu (á, é, ô, v.v.) vào danh sách, số khác thì không).

Bạn có thể đảo ngược điều đó bằng cách sử dụng \W để có nghĩa là mọi thứ không phải là chữ và số.

Vì vậy, thay thế \W bằng chuỗi rỗng sẽ xóa tất cả ký tự 'đặc biệt'.


Ngoài ra, nếu bạn cần một bộ khác nhau của nhân vật để tự chữ và số, bạn có thể sử dụng một lớp nhân vật phủ nhận: [^abc] sẽ phù hợp với tất cả mọi thứ đó không phải là a hoặc b hoặc c[^a-z] sẽ phù hợp với tất cả mọi thứ đó không phải là trong khoảng a,b,c,d...x,y,z

tương đương với \w[A-Za-z0-9_] và do đó \W[^A-Za-z0-9_]

0

Bạn đang sử dụng regex ở ngôn ngữ nào?

Ví dụ, trong Perl bạn có thể làm một bản dịch đó sẽ dịch bất kỳ của các ký tự trong danh sách của bạn vào không có gì:

ví dụ Điều này sẽ dịch 'a', 'b', 'c' hoặc 'd' thành ''

$sentence =~ tr/abcd//; 
2

tôi thích regex vì cú pháp đơn giản hơn để đọc và duy trì:

# in Python 
import re 
re.sub("[abcdef]", "", text) 

trong đó abcdef là các ký tự được thoát đúng cách để xóa.

Ngoài ra, nếu bạn muốn chỉ ký tự chữ (cộng với dấu gạch dưới), bạn có thể sử dụng:

re.sub("\W", "", text) 

nơi \W đại diện cho một nhân vật phi từ, ví dụ: [^a-zA-Z_0-9].

1

Khi bạn chỉ muốn có ký tự chữ, bạn chỉ có thể diễn tả điều này bằng cách sử dụng một lớp nhân vật đảo ngược:

[^A-Za-z0-9]+ 

Điều này có nghĩa: mỗi nhân vật đó không phải là chữ và số.

+0

không hoàn toàn, bạn quên A-Z Tôi nghĩ :) – Robert

+0

Điều này có thể được đơn giản hóa thành \ w – UnkwnTech

+0

\ w là viết tắt của [A-Za-z0-9_] và tôi cũng không chắc chắn liệu anh ấy có muốn giới hạn thấp hay không. – Gumbo

1

đây là một regex đơn giản

[^\w] 

này nên bắt tất cả các ký tự không phải chữ này sẽ cho phép az AZ 0 -9 không gian và _ không gian cũng không _ nằm trong danh sách của bạn nên nó hoạt động nếu bạn muốn bắt những thứ này cũng vậy thì tôi sẽ làm gì đó ng như thế này:

/[a-z0-90/i 

đây là định dạng PHP cho a-z và 0-9 tôi làm cho nó không phân biệt chữ hoa chữ thường.

+0

Điều này là sai. \ w không * không * bao gồm dấu cách. Nó cũng quá phức tạp để làm "[^ \ w]" thay vì chỉ "\ W". Và biểu thức thứ hai của bạn sẽ không hoạt động - nó có một số không ở vị trí đóng khung. Đây cũng không phải là định dạng dành riêng cho PHP, nó hoạt động với nhiều dạng khác nhau. –

0

Bạn có thể xác thực chúng ở giao diện người dùng bằng cách lấy các giá trị khóa của các ký tự được khóa.

0

Cách tiếp cận lý tưởng trong PHP sẽ là ...

$text = "ABCDEF...Á123"; 
$text = preg_replace('/[^\p{L}]/i', '', $text); 
print($text); # Output: ABCDEFÁ 

Hoặc, trong Perl ...

my $text = "ABCDEF...Á123"; 
$text =~ s/[^\p{L}]//gi; 
print($text); # Output: ABCDEFÁ 

Nếu bạn chỉ phù hợp trên [^ a-zA-Z], bạn sẽ bỏ lỡ tất cả các ký tự có dấu, mà (đối với hầu hết các phần), tôi tưởng tượng bạn sẽ muốn giữ lại.

Các vấn đề liên quan