2013-03-25 37 views

Trả lời

55

Người đầu tiên phù hợp với một khoảng trắng đơn là những gì, trong khi cái thứ hai phù hợp với một hoặc nhiều khoảng trắng. Họ là những cái gọi là quantifiers biểu hiện thường xuyên, và họ thực hiện các trận đấu như thế này (lấy từ documentation):

Greedy quantifiers 
X? X, once or not at all 
X* X, zero or more times 
X+ X, one or more times 
X{n} X, exactly n times 
X{n,} X, at least n times 
X{n,m} X, at least n but not more than m times 

Reluctant quantifiers 
X?? X, once or not at all 
X*? X, zero or more times 
X+? X, one or more times 
X{n}? X, exactly n times 
X{n,}? X, at least n times 
X{n,m}? X, at least n but not more than m times 

Possessive quantifiers 
X?+ X, once or not at all 
X*+ X, zero or more times 
X++ X, one or more times 
X{n}+ X, exactly n times 
X{n,}+ X, at least n times 
X{n,m}+ X, at least n but not more than m times 
+8

Tôi đã luôn luôn yêu cách họ cung cấp các mô tả riêng biệt của các phiên bản tham lam, miễn cưỡng, và sở hữu của mỗi định lượng, và sau đó nói chính xác điều tương tự về cả ba. ;) –

2

Các regex đầu tiên sẽ phù hợp với một ký tự khoảng trắng. Regex thứ hai sẽ miễn cưỡng phù hợp với một hoặc nhiều ký tự khoảng trắng. Đối với hầu hết các mục đích, hai regex này rất giống nhau, ngoại trừ trong trường hợp thứ hai, regex có thể khớp với nhiều hơn của chuỗi, nếu nó ngăn không cho kết hợp regex bị lỗi. từ http://www.coderanch.com/t/570917/java/java/regex-difference

+0

Làm xước từ "miễn cưỡng". Câu hỏi này là về '\ s +', không phải '\ s +?' Giống như câu hỏi khác. –

30

Hai cuộc gọi replaceAll này sẽ luôn tạo ra kết quả tương tự, bất kể số x là gì. Tuy nhiên, điều quan trọng cần lưu ý là hai biểu thức thông thường không giống nhau:

  • \\s - phù hợp với đơn ký tự khoảng trắng
  • \\s+ - phù hợp với trình tự của một hoặc nhiều ký tự khoảng trắng.

Trong trường hợp này, nó không có sự khác biệt, vì bạn đang thay thế mọi thứ bằng một chuỗi rỗng (mặc dù tốt hơn nên sử dụng \\s+ từ quan điểm hiệu quả). Nếu bạn đang thay thế bằng một chuỗi không trống, cả hai sẽ hành xử khác nhau.

+0

W.r.t dòng đầu tiên của bạn, Nếu x là "Đặt tên miền của bạn và nhận \ n \ n \ n \ n \ n \ n Trực tuyến ngay hôm nay". Cả hai sẽ tạo ra kết quả tương tự? – user3705478

+2

@ user3705478 Cả hai đều sẽ tạo ra kết quả tương tự, ngay cả khi có nhiều khoảng trống sau mỗi kết quả. Sự khác biệt nằm trong cách nó được xử lý. Nếu bạn sẽ có một nhóm (ví dụ) 3 không gian trực tiếp theo sau nhau \\ s + lấy nhóm đó và biến toàn bộ nó thành một "", trong khi \\ s sẽ tự mình tự mình phát triển mọi không gian. – Daemun

7

Trước hết bạn cần hiểu rằng đầu ra cuối cùng của cả hai câu lệnh sẽ giống nhau, tức là xóa tất cả các khoảng trắng khỏi chuỗi đã cho. Tuy nhiên x.replaceAll("\\s+", ""); sẽ là cách hiệu quả hơn để cắt không gian (nếu chuỗi có nhiều khoảng trống liền kề) vì ít có khả năng thay thế do thực tế là regex \\s+ khớp 1 hoặc nhiều dấu cách cùng một lúc và thay thế chúng bằng chuỗi rỗng .

Vì vậy, ngay cả khi bạn nhận được đầu ra tương tự từ cả nó là tốt hơn để sử dụng:

x.replaceAll("\\s+", ""); 
Các vấn đề liên quan