2009-02-17 26 views
16

Tôi mới sử dụng cụm từ thông dụng.Cách sử dụng cụm từ thông dụng để đối sánh mọi thứ trước một loại từ nhất định

Có thể đối sánh mọi thứ trước một từ đáp ứng một tiêu chí nhất định:

Ví dụ:

THIS IS A TEST - - +++ Đây là một thử nghiệm

Tôi muốn nó gặp phải một từ bắt đầu bằng một chữ hoa và ký tự tiếp theo là chữ thường. Điều này tạo thành một từ thích hợp. Sau đó tôi muốn xóa mọi thứ trước từ đó.

Ví dụ ở trên phải xuất: Đây là một thử nghiệm

Tôi chỉ muốn xử lý này cho đến khi tìm được từ thích hợp và sau đó dừng lại.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn

+0

Trong trường hợp bạn không đặt nó ở cuối "Trả lời" của tôi, hãy chắc chắn rằng bạn kiểm tra một không gian trong khe thứ hai. Để có độ tin cậy cao hơn một chút, bạn có thể kiểm tra "I" và "A" là trường hợp đặc biệt. Ngoài ra, điều đó sẽ phá vỡ ví dụ của bạn "A TEST" sẽ khớp. Đây không phải là một thuật toán rất tốt. –

Trả lời

45

Thay

^.*?(?=[A-Z][a-z]) 

với chuỗi rỗng. Điều này làm việc cho đầu vào ASCII. Đối với đầu vào không phải ASCII (Unicode, các ngôn ngữ khác), các chiến lược khác nhau sẽ được áp dụng.

Giải thích

.*? Everything, until 
(?= followed by 
[A-Z] one of A .. Z and 
[a-z] one of a .. z 
) 

Các biến thể Java Unicode-enabled sẽ là:

^.*?(?=\p{Lu}\p{Ll}) 
+0

@Tomalak Cảm ơn điều này thực sự gần với những gì tôi muốn. Nó trả về các giá trị mà tôi không muốn. Có cách nào tôi có thể chuyển đổi nó, nơi nó trả về chuỗi mà tôi cần? –

+0

@Tomalak nevermind tác phẩm này. Tôi thực sự đánh giá cao sự giúp đỡ của bạn cũng như người khác đã giúp đỡ –

0

sau đó bạn có thể làm một cái gì đó như thế này

'.*([A-Z][a-z].*)\s*' 

.* matches anything 
([A-Z] #followed by an uper case char 
    [a-z] #followed by a lower case 
    .*) #followed by anything 
    \s* #followed by zeror or more white space 

Đó là những gì bạn đang tìm kiếm Tôi nghĩ rằng

3

Sau khi thức dậy một chút, bạn không cần xóa bất kỳ thứ gì, hoặc thậm chí tạo một nhóm phụ - chỉ cần tìm mẫu được thể hiện ở đâu đó trong câu trả lời. Dưới đây là một ví dụ hoàn chỉnh:

import java.util.regex.*; 

public class Test 
{ 
    public static void main(String args[]) 
    { 
     Pattern pattern = Pattern.compile("[A-Z][a-z].*"); 

     String original = "THIS IS A TEST - - +++ This is a test"; 
     Matcher match = pattern.matcher(original); 
     if (match.find()) 
     { 
      System.out.println(match.group()); 
     } 
     else 
     { 
      System.out.println("No match"); 
     }   
    } 
} 

EDIT: Câu trả lời gốc

này trông giống như nó đang làm điều đúng đắn:

import java.util.regex.*; 

public class Test 
{ 
    public static void main(String args[]) 
    { 
     Pattern pattern = Pattern.compile("^.*?([A-Z][a-z].*)$"); 

     String original = "THIS IS A TEST - - +++ This is a test"; 
     String replaced = pattern.matcher(original).replaceAll("$1"); 

     System.out.println(replaced); 
    } 
} 

Về cơ bản các thủ thuật không phải là để bỏ qua tất cả mọi thứ trước khi từ thích hợp - đó là để nhóm mọi thứ từ từ thích hợp trở đi và thay thế toàn bộ văn bản bằng nhóm đó.

Ở trên sẽ không thành công với "*** FOO *** I am fond of peanuts" vì "Tôi" sẽ không được coi là một từ thích hợp. Nếu bạn muốn sửa lỗi đó, hãy thay đổi [a-z] thành [a-z \ s] sẽ cho phép khoảng trắng thay vì một chữ cái.

+0

Tôi nghĩ từ câu hỏi anh ấy đang tìm kiếm mọi thứ trước từ thích hợp (không phải cách khác xung quanh như ví dụ của bạn) – hhafez

+0

Anh ấy muốn * xóa * mọi thứ trước khi thích hợp từ. Nhìn vào ví dụ của mình - anh ta muốn kết quả là "Đây là một thử nghiệm", đó chính xác là những gì mã của tôi tạo ra. –

+0

Tuy nhiên, nó phức tạp hơn nó cần phải được, do một sự hiểu sai khác nhau. Chỉnh sửa ... –

0

([A-Z] [a-z].+)

sẽ phù hợp:

Đây là một văn bản

1

tôi biết quan điểm của tôi về vấn đề này thực sự không phải là phổ biến, do đó bạn guys có thể xuống bỏ phiếu cho tôi vào quên lãng nếu bạn muốn, nhưng Tôi phải rant một chút (và điều này có chứa một giải pháp, chỉ cần không theo cách áp phích yêu cầu).

Tôi thực sự không hiểu tại sao mọi người chuyển sang cụm từ thông dụng quá nhanh.

Tôi đã thực hiện rất nhiều phân tích chuỗi (Được sử dụng để sàng lọc màn hình menu vt100) và tôi chưa bao giờ tìm thấy một trường hợp nào biểu thức thông thường sẽ dễ dàng hơn nhiều so với chỉ viết mã. (Có lẽ một cặp vợ chồng sẽ dễ dàng hơn một chút, nhưng không nhiều).

Tôi hiểu rằng chúng dễ dàng hơn khi bạn biết chúng - nhưng bạn thấy ai đó đặt câu hỏi như thế này và nhận ra chúng không dễ dàng cho mọi lập trình viên chỉ bằng cách liếc nhìn nó. Nếu chi phí 1 lập trình ở đâu đó trong dòng 10 phút của suy nghĩ, nó có một mất mát lớn trên chỉ cần mã hóa nó, ngay cả khi bạn mất 5 phút để viết 5 dòng.

Vì vậy, nó sẽ cần tài liệu - và nếu ai đó ở cùng cấp ngang qua nó, anh ấy sẽ không thể sửa đổi nó mà không có kiến ​​thức bên ngoài miền của mình, ngay cả với tài liệu.

Tôi muốn nói rằng nếu người đăng tải phải hỏi về một vụ án tầm thường - thì đó không phải là một trường hợp tầm thường.

public String getRealText(String scanMe) { 
    for(int i=0 ; i < scanMe.length ; i++) 
     if(isUpper(scanMe[i]) && isLower(scanMe[i+1])) 
      return scanMe.subString(i); 
return null; } 

Tôi có nghĩa là 5 dòng, nhưng nó đơn giản, dễ đọc và nhanh hơn hầu hết các trình phân tích cú pháp RE (tất cả?). Khi bạn đã bao bọc cụm từ thông dụng trong một phương thức và nhận xét nó, sự khác biệt về kích thước không thể đo lường được. Sự khác biệt về thời gian - cũng đối với áp phích, nó rõ ràng sẽ là một thời gian ít hơn rất nhiều - vì nó có thể là cho người tiếp theo mà đi qua mã của mình.

Và hoạt động chuỗi này là một trong những người mà thậm chí còn dễ dàng hơn trong C với con trỏ - và nó sẽ là thậm chí nhanh hơn kể từ khi chức năng kiểm tra là macro trong C.

Bằng cách này, chắc chắn bạn nhìn cho một không gian trong khe thứ hai, không chỉ là biến trường hợp thấp hơn, nếu không bạn sẽ bỏ lỡ bất kỳ dòng nào bắt đầu bằng từ A hoặc I.

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