2012-12-20 32 views
5

Regex của tôi đang xóa tất cả số (0-9) trong chuỗi của tôi. Tôi không hiểu tại sao tất cả các số được thay thế bằng _vấn đề regex Số C# được gạch dưới bây giờ

EDIT: Tôi hiểu rằng mẫu "regex" của tôi thay đổi ký tự thành dấu gạch dưới. Nhưng không phải lý do tại sao con số!

Có ai có thể giúp tôi không? Tôi chỉ cần loại bỏ giống như tất cả các nhân vật đặc biệt.

Xem regex ở đây:

string symbolPattern = "[[email protected]#$%^&*()-=+`~{}'|]"; 
Regex.Replace("input here 12341234" , symbolPattern, "_"); 

Output: "input here ________" 

Trả lời

8

Vấn đề là mô hình của bạn sử dụng một dấu gạch ngang ở giữa, mà đóng vai trò như một loạt các nhân vật ascii từ ) để =. Dưới đây là một sự cố:

  • ): 41
  • 1: 49
  • =: 61

Như bạn có thể thấy, số bắt đầu từ 49 tuổi, và rơi giữa khoảng 41-61 , vì vậy chúng khớp và được thay thế.

Bạn cần đặt - ở hai đầu hoặc cuối của lớp nhân vật cho nó để được xuất hiện theo nghĩa đen chứ không phải là hành động như một khoảng:

"[[email protected]#$%^&*()=+`~{}'|]" 
+1

Cảm ơn, cho tất cả. Tôi phải chọn một câu trả lời và câu trả lời này là câu trả lời chi tiết nhất giải thích vấn đề. Cảm ơn vì đầu vào của bạn. – Rob

1

Bạn cần phải thoát khỏi nhân vật đặc biệt của bạn trong regex của bạn. Ví dụ: * là một đối sánh ký tự đại diện. Nhìn vào những gì một số trong những nhân vật đặc biệt có ý nghĩa cho trận đấu của bạn.

+1

Đúng để thoát (đặc biệt là "-"), nhưng '*' có nghĩa là "0 hoặc nhiều hơn", không phải "bất kỳ ký tự nào". –

+0

@RowlandShaw: đã chỉnh sửa – RonaldBarzell

4

bạn phải thoát - vì chuỗi [)-=] chứa chữ số

string symbolPattern = "[[email protected]#$%^&*()\-=+`~{}'|]"; 
2

Di chuyển - đến cuối danh sách để nó được xem như một chữ:

"[[email protected]#$%^&*()=+`~{}'|-]" 

Hoặc, để các trước:

"[[email protected]#$%^&*()=+`~{}'|]" 

Vì nó đứng, nó sẽ khớp với tất cả các ký tự trong phạm vi )-=, bao gồm tất cả các chữ số.

0

Tôi đã không sử dụng C#, nhưng thường là ký tự "*" cũng là ký tự điều khiển cần phải thoát.

Sau đây phù hợp với một dòng toàn bộ của bất kỳ nhân vật, mặc dù "^" và "$" là một số những gì không cần thiết:

^.*$ 

này phù hợp với bất kỳ số lượng ký tự "A" xuất hiện trong một chuỗi:

A* 

Các "Owl" cuốn sách từ oreilly là những gì bạn thực sự cần phải nghiên cứu này:

http://shop.oreilly.com/product/9780596528126.do?green=B5B9A1A7-B828-5E41-9D38-70AF661901B8&intcmp=af-mybuy-9780596528126.IP

+0

Nó là một metacharacter regex, và bạn nói đúng rằng nó phù hợp với bất kỳ số lần, tuy nhiên đây không phải là trường hợp khi nó xảy ra bên trong một lớp nhân vật. Điều này theo nghĩa đen phù hợp với một dấu hoa thị: '[*]'. –

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