2012-07-04 29 views
5

Tôi có một vấn đề khá đặc biệt. Tôi đang cố tìm mẫu như [some string][word boundary]. Đơn giản hóa, mã của tôi là: b không khớp khi ký tự trước là một ranh giới từ

final Pattern pattern = Pattern.compile(Pattern.quote(someString) + "\\b"); 
final String value = someString + " "; 
System.out.println(pattern.matcher(value).find()); 

Logic của tôi nói với tôi điều này nên luôn luôn xuất true, bất kể những gì someString là. Tuy nhiên:

  • nếu kết thúc bằng ký tự từ (ví dụ: "abc"), true được xuất;
  • nếu someString kết thúc bằng ranh giới từ (ví dụ: "abc."), false được xuất.

Bất kỳ ý tưởng gì đang xảy ra? Giải pháp hiện tại của tôi là sử dụng \W thay vì \b, nhưng tôi không chắc chắn về các tác động.

Trả lời

6

Dấu chấm sau đó một khoảng trắng không phải là một ranh giới từ.

Ranh giới từ nằm giữa ký tự từ, sau đó là ký tự không phải từ hoặc ngược lại.
tức là giữa [a-zA-Z0-9_][^a-zA-Z0-9_] hoặc [^a-zA-Z0-9_][a-zA-Z0-9_]

4

Ranh giới từ là một ký tự không phải từ được đặt trước bởi một ký tự từ hoặc ngược lại. Khoảng trống trước một khoảng thời gian (2 ký tự không phải từ) không đáp ứng yêu cầu này.

Ảnh hưởng của việc sử dụng \W là bất kỳ ký tự không phải từ nào sẽ được đối sánh (giống như \b, nhưng không có điều kiện ký tự đứng trước ký tự từ).

+0

Vâng, nhưng thời gian trong 'abc.' nên trở thành một phần của regex (thông qua 'Pattern.quote ("abc").'. Vì vậy, mô hình sẽ trở nên "' abc.' theo sau là một ranh giới từ ", phải khớp với' abc.' theo sau là một dấu cách. – Felix

+1

@Felix cho một ký tự là một ranh giới từ, nó phải là một ký tự không phải là từ được đặt trước bởi một ký tự từ. một thời gian không đáp ứng yêu cầu này –

+0

Cảm ơn! Tôi đã bị ấn tượng vì nó chỉ là một phím tắt của lớp nhân vật, giống như '\ W'. – Felix

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