2011-09-22 37 views
7

Tôi muốn xóa tất cả các ký tự khỏi chuỗi, sử dụng cách đơn giản nhất. Ví dụ "a,sd3 31ds"-"asdds" Tôi CAD làm điều đó một cái gì đó như thế này:Cách đơn giản để xóa tất cả các ký tự không phải từ

"a,sd3 31ds".gsub(/\W/, "").gsub(/\d/,"") 
# => "asdds" 

nhưng có vẻ một chút vụng về. Có lẽ nó có thể hợp nhất các rexegs trong một?

Trả lời

17
"a,sd3 31ds".gsub(/(\W|\d)/, "") 
4

gì về

"a,sd3 31ds".gsub(/\W|\d/,"") 

Bạn luôn có thể tham gia biểu thức thông thường bởi | đưa ra "hoặc".

5

Bạn có thể thực hiện việc này bằng regex "HOẶC".

"205h2n0bn r0".gsub(/\W|\d/, "") 

sẽ làm các trick :)

4

Bạn có thể thử regex này:

\P{L} 

không thư Unicode, nhưng tôi không biết, không của Ruby hỗ trợ lớp học này.

+0

của Ruby 1.9 không. [link] (https://github.com/ruby/ruby/blob/trunk/doc/re.rdoc) – steenslag

+0

@steenslag, Tuyệt vời. Vì vậy, cung cấp regex là chính xác. –

4

Một giải pháp regex phi:

"a,sd3 31ds".delete('^A-Za-z') 
+0

'" a, sd3 [] 31ds ".delete ('^ A-z')' => '" asd [] ds "' –

+0

@undur_gongor: Ah có. Tôi sẽ sửa chữa nó. – steenslag

12

tôi sẽ đi cho regexp /[\W\d]+/. Nó có khả năng nhanh hơn ví dụ: /(\W|\d)/.

require 'benchmark' 

N = 500_000 
Regexps = [ "(\\W|\\d)", "(\\W|\\d)+", "(?:\\W|\\d)", "(?:\\W|\\d)+", 
      "\\W|\\d", "[\\W\\d]", "[\\W\\d]+" ] 

Benchmark.bm(15) do |x| 
    Regexps.each do | re_str | 
    re = Regexp.new(re_str) 
    x.report("/#{re_str}/:") { N.times { "a,sd3 31ds".gsub(re, "") }} 
    end 
end 

cho (với ruby ​​2.0.0p195 [x64-mingw32])

     user  system  total  real 
/(\W|\d)/:  1.950000 0.000000 1.950000 ( 1.951437) 
/(\W|\d)+/:  1.794000 0.000000 1.794000 ( 1.787569) 
/(?:\W|\d)/:  1.857000 0.000000 1.857000 ( 1.855515) 
/(?:\W|\d)+/:  1.638000 0.000000 1.638000 ( 1.626698) 
/\W|\d/:   1.856000 0.000000 1.856000 ( 1.865506) 
/[\W\d]/:   1.732000 0.000000 1.732000 ( 1.754596) 
/[\W\d]+/:  1.622000 0.000000 1.622000 ( 1.617705) 
Các vấn đề liên quan