2009-03-23 47 views
7

Làm cách nào để viết một Mẫu (Java) để khớp với bất kỳ chuỗi ký tự nào ngoại trừ một danh sách các từ nhất định?Mẫu Java để khớp với bất kỳ chuỗi ký tự nào trừ một danh sách nhất định

Tôi cần tìm xem liệu một mã đã cho có bất kỳ văn bản nào được bao quanh bởi các thẻ như bên cạnh danh sách các từ đã cho hay không. Ví dụ: tôi muốn kiểm tra xem có bất kỳ từ nào khác ngoài "một" và "hai" được bao quanh bởi thẻ hay không.

"This is the first tag <span>one</span> and this is the third <span>three</span>" 

Mẫu phải khớp với chuỗi ở trên vì từ "ba" được bao quanh bởi thẻ và không nằm trong danh sách các từ đã cho ("một", "hai").

+0

Bạn có nhận thấy rằng có sự khác biệt cần thiết giữa câu hỏi của bạn ngay trước khi chỉnh sửa, bất kỳ ai trả lời câu hỏi trước khi chỉnh sửa của bạn về cơ bản đã lãng phí thời gian của họ chưa? Cố gắng hoàn toàn rõ ràng ngay từ đầu thời gian tới. Không ai ở đây có một quả cầu pha lê hoặc có thể đọc được suy nghĩ của bạn. – Tomalak

Trả lời

2

Sử dụng này:

if (!Pattern.matches(".*(word1|word2|word3).*", "word1")) { 
    System.out.println("We're good."); 
}; 

Bạn đang kiểm tra các mô hình làm không phù hợp với chuỗi.

+0

Cảm ơn bạn đã phản hồi nhưng điều này sẽ không hoạt động. Tôi đã thêm nhiều thông tin hơn vào mô tả sự cố. – Mario

7

Look-trước có thể làm điều này:

\b(?!your|given|list|of|exclusions)\w+\b 

Trận

  • boundary (bắt đầu-of-word)
  • không theo sau bởi bất kỳ của "bạn", "cho" , "danh sách", "của", "loại trừ"
  • được theo sau bởi nhiều ký tự từ
  • theo sau là một ranh giới từ (cuối từ)

Thực tế, điều này khớp với bất kỳ từ nào không bị loại trừ.

4

Điều này sẽ giúp bạn bắt đầu.

import java.util.regex.*; 

// >(?!one<|two<)(\w+)/ 
// 
// Match the character “>” literally «>» 
// Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!one|two)» 
// Match either the regular expression below (attempting the next alternative only if this one fails) «one» 
//  Match the characters “one<” literally «one» 
// Or match regular expression number 2 below (the entire group fails if this one fails to match) «two» 
//  Match the characters “two<” literally «two» 
// Match the regular expression below and capture its match into backreference number 1 «(\w+)» 
// Match a single character that is a “word character” (letters, digits, etc.) «\w+» 
//  Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
// Match the characters “/” literally «</» 
List<String> matchList = new ArrayList<String>(); 
try { 
    Pattern regex = Pattern.compile(">(?!one<|two<)(\\w+)/"); 
    Matcher regexMatcher = regex.matcher(subjectString); 
    while (regexMatcher.find()) { 
     matchList.add(regexMatcher.group(1)); 
    } 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 
+0

Tôi nghĩ rằng bạn có thể muốn thay đổi "một" và "hai" trong mẫu thành "một" và "hai <" để bạn vẫn có thể khớp với những thứ bắt đầu bằng một trong số đó. –

+0

@Marty - bạn nói đúng. Tôi sẽ cập nhật câu trả lời. –

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