2011-07-29 70 views
7

Tôi có thể sử dụng một regex javascript để đếm số ký tự khoảng trắng trước ký tự đầu tiên trong chuỗi không? Tôi chỉ quan tâm nếu có 0, 1 và 2+.javascript regex để đếm các ký tự khoảng trắng

Giải pháp làm việc hiện tại của tôi là có ba regex và chỉ sử dụng đối sánh để xác định loại 0,1 hoặc 2+ (mẫu riêng biệt cho mỗi loại), nhưng Im tìm kiếm một giải pháp thanh lịch hơn.

Thậm chí có thể đếm các mẫu với regex không? Tôi có thể sử dụng một nhóm phi tham lam và đếm thời gian tôi đoán ....

+0

Có 2+ có nghĩa là hai hoặc nhiều hơn? Có ý định của bạn để sản xuất một số cho mỗi loại chuỗi? –

Trả lời

6
"  a".match(/^\s{0,2}/)[0].length 

regex này phù hợp giữa 0 và 2 ký tự khoảng trắng ở phần đầu của một chuỗi.

+1

Tại sao không phải 'theString.match (/^\ s + /) [0] .length' - OP có nghĩa là, tôi nghĩ 2+ có nghĩa là hai hoặc nhiều hơn, mặc dù nó được viết một cách kỳ lạ. –

+0

@Ray: Có vẻ như chỉ có ba loại. – SLaks

+0

chính xác, chỉ có ba loại: 0, 1 hoặc 2+. Tôi cũng cần phải có được tất cả mọi thứ sau khi khoảng trắng hàng đầu, giống như một trang trí java. – hvgotcodes

4

Bạn chỉ có thể làm:

" aaa".replace(/^(\s*).*$/,"$1").length 
+1

Dường như không hoạt động khi không có khoảng trắng ban đầu - nó trả về độ dài của toàn bộ từ. – jfriend00

+0

cảm ơn, tôi đã thay đổi dấu + thành * – Enki

2

Tôi không chắc chắn tôi muốn sử dụng một regex trong cuộc sống thực cho công việc này, nhưng bạn có thể kết hợp chúng trong ảnh chụp và xem chiều dài của chúng:

function countLeadingSpaces(str) { 
    return(str.match(/^(\s*)/)[1].length; 
} 

Một regex cách không được thiết kế cho tốc độ (khá nhiều bất cứ điều gì đang đến rất nhanh so với một regex):

function countLeadingSpaces2(str) { 
    for (var i = 0; i < str.length; i++) { 
     if (str[i] != " " && str[i] != "\t") { 
      return(i); 
     } 
    } 
    return(str.length); 
} 
+1

Tại sao không sử dụng '\ s *' và loại bỏ hoàn toàn việc kiểm tra "trùng khớp"? – paxdiablo

+0

'/^(\ s *) [^ \ t] /' của một chuỗi rỗng trả về null có nghĩa là bạn không thể trực tiếp dereference '[1] .length' trên một trận đấu bằng cách sử dụng nó mà không có một số loại kiểm tra. Tôi không đề xuất phương pháp của tôi là nhỏ gọn nhất, nhưng tôi đã cố gắng để được an toàn cho tất cả các trường hợp cạnh. – jfriend00

+1

aah, tôi hiểu - nhưng tôi nghĩ nó trả về null vì nó không thể tìm thấy bit '[\ t]'. Vì các regex đều tham lam, bạn chỉ có thể sử dụng '^ (\ s *)'. – paxdiablo

0

Tại sao không chỉ cần sử dụng một nhóm chụp và kiểm tra độ dài:

<html> 
    <head> 
    </head> 
    <body> 
     <script language="javascript"> 
      var myStr = " hello"; 
      var myRe = /^(\s*)(.*)$/; 
      var match = myRe.exec(myStr); 
      alert(match[1].length); // gives 2 
      alert(match[2]);   // gives "hello" 
     </script> 
    </body> 
</html 

Điều này có thể được theo sau bởi mã hoạt động trên ba trường hợp của bạn, độ dài là 0, 1 hoặc cách khác, và hoạt động trên phần còn lại của chuỗi.

Bạn nên coi các regex là công cụ , không phải là toàn bộ hộp công cụ .

1

Bạn có thể tìm thấy chỉ mục của ký tự không dấu cách đầu tiên trong chuỗi, giống như số ký tự trắng hàng đầu.

t.search(/\S/); 

Nếu bạn nhấn mạnh bạn có thể giới hạn trở về 0, 1 hoặc 2 với Math.min(t.search(/\S/), 2);

Nếu có không ký tự không gian sự trở lại sẽ là -1 ....

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