2008-10-08 43 views
43

Tôi đang làm gì sai ở đây?Regex để đối sánh chữ và số và dấu cách

string q = "john s!"; 
string clean = Regex.Replace(q, @"([^a-zA-Z0-9]|^\s)", string.Empty); 
// clean == "johns". I want "john s"; 
+0

ok, duh tôi ngốc nghếch^bắt đầu bằng ... tôi mệt. vẫn không biết làm thế nào để phù hợp với chỉ là một không gian –

Trả lời

60

chỉ là một FYI

string clean = Regex.Replace(q, @"[^a-zA-Z0-9\s]", string.Empty); 

sẽ thực sự được tốt hơn như

string clean = Regex.Replace(q, @"[^\w\s]", string.Empty); 
+3

FYI \ w bao gồm _, quá. – CSchulz

+9

"\ w" không giống với "a-zA-Z0-9". "\ w" bao gồm các ký tự nằm ngoài phạm vi đó – markmnl

3

Tôi nghi ngờ^không hoạt động theo cách bạn cho là ngoài lớp nhân vật.

Điều bạn đang nói là thay thế mọi thứ không phải là chữ số bằng chuỗi rỗng HOẶC bất kỳ không gian hàng đầu nào. Tôi nghĩ điều bạn muốn nói là không gian không thể thay thế - hãy thử di chuyển \ s vào lớp [].

+0

bạn đang phải, đó là bắt đầu với (mà tôi biết, nhưng nó là muộn) –

1

Có vẻ như có hai vấn đề.

  1. Bạn đang sử dụng^bên ngoài một [] mà phù hợp với sự khởi đầu của dòng
  2. Bạn không sử dụng một * hoặc + có nghĩa là bạn sẽ chỉ phù hợp với một nhân vật duy nhất.

Tôi nghĩ rằng bạn muốn regex sau @ "([^ a-zA-Z0-9 \ s]) +"

+0

Nó sẽ không thay thế tất cả các chữ số và không gian với chuỗi rỗng? – zigdon

+0

Về số 2, định lượng không thực sự quan trọng vì anh ta muốn thay thế tất cả các ký tự không khớp trong chuỗi chứ không chỉ là một lần chạy duy nhất, yêu cầu thay thế toàn cục (.../g trong Perl, không chắc chắn của cú pháp C#), có hoặc không có dấu */+. –

+0

C# regex là @ "^ [a-zA-Z0-9 \ r] + $" – marcel

0

Các circumflex bên trong dấu ngoặc vuông có nghĩa là tất cả các nhân vật ngoại trừ phạm vi tiếp theo. Bạn muốn có dấu mũ ngoài dấu ngoặc vuông.

+0

Vâng, tôi muốn nó bên trong.Phù hợp với bất kỳ thứ gì không phải là các ký tự này, –

+1

Ồ, nơi bạn nói "Tôi muốn" Tôi nghĩ bạn muốn nói rằng bạn muốn có một biểu thức chính quy để khớp với điều đó. Bạn có nghĩa là bạn muốn kết quả của Thay thế là điều đó. Vì vậy, bạn muốn biểu thức chính quy không khớp với điều đó. Não tôi đau. –

12

tôi đã nhận nó:

string clean = Regex.Replace(q, @"[^a-zA-Z0-9\s]", string.Empty); 

Không biết bạn có thể đặt \ s trong dấu ngoặc

+0

Regex của bạn sẽ chỉ phù hợp với chuỗi không chứa số alpha, số hoặc dấu cách.^Ở đầu của một [] có nghĩa là "không phải bất cứ điều gì bên trong đây" – JaredPar

+2

Đó chính là điều tôi muốn. Trong Regex.Replace, tôi muốn khớp với bất kỳ thứ gì KHÔNG phải là chữ cái, số hoặc không gian. –

+0

Ah được rồi, rõ ràng hơn bây giờ. – JaredPar

16

này:

string clean = Regex.Replace(dirty, "[^a-zA-Z0-9\x20]", String.Empty); 

\ x20 là ascii hex cho ký tự 'không gian'

bạn có thể thêm nhiều ký tự riêng lẻ mà bạn muốn cho phép. Nếu bạn muốn ví dụ "?" để được ok trong chuỗi trả lại thêm \ x3f.

+0

bạn cũng có thể khớp với một ký tự ** ASCII ** làm bát phân. Trong trường hợp đó ** \ 040 ** đại diện cho ký tự khoảng trắng. –

+0

... hoặc bạn có thể chỉ cần gõ nguyên văn nếu chúng là những thứ đơn giản như không gian hoặc?: '[^ A-Za-z0-9?]' Vv – ChrisF

2

Các regex sau đây là để đưa không gian trong hộp văn bản.

Regex r = new Regex("^[a-zA-Z\\s]+"); 
r.IsMatch(textbox1.text); 

Điều này phù hợp với tôi.

+0

Sẽ không '[A-z \\ s]' dễ hơn '[a-zA-Z \\ s]'? – Alexander

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