Câu hỏi Danh sách tất cả các ký tự đặc biệt cần phải được thoát trong một regex


Tôi đang cố gắng tạo một ứng dụng khớp với mẫu tin nhắn với một thông điệp mà người dùng đang cố gắng gửi. Tôi đang sử dụng regex Java cho phù hợp với tin nhắn. Mẫu / tin nhắn có thể chứa các ký tự đặc biệt.

Làm cách nào để có được danh sách đầy đủ các ký tự đặc biệt cần phải được thoát để regex của tôi hoạt động và khớp trong các trường hợp tối đa có thể?

Có một giải pháp phổ quát để thoát khỏi tất cả các ký tự đặc biệt trong regex Java?


76
2018-01-03 07:14


gốc




Các câu trả lời:


Bạn có thể xem javadoc của lớp Pattern: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Bạn cần phải thoát khỏi bất kỳ char được liệt kê ở đó nếu bạn muốn char thường xuyên và không phải là ý nghĩa đặc biệt.

Là một giải pháp có thể đơn giản hơn, bạn có thể đặt mẫu giữa \ Q và \ E - mọi thứ giữa chúng được coi là đã thoát.


63
2018-01-03 07:44



Nếu bạn thấy \ Q và \ E khó nhớ thì bạn có thể dùng Pattern.quote ("...") - mkdev
Tôi ước bạn thực sự đã tuyên bố họ - Aleksandr Dubinsky
Tại sao, @AleksandrDubinsky? - Sorin
@Sorin Bởi vì nó là tinh thần (nay, chính sách?) Của Stack Exchange để nhà nước trả lời trong câu trả lời của bạn hơn là chỉ liên kết đến một nguồn tài nguyên off-site. Bên cạnh đó, trang đó cũng không có danh sách rõ ràng. Một danh sách có thể được tìm thấy ở đây: docs.oracle.com/javase/tutorial/essential/regex/literals.html, nhưng nó nói "Trong các tình huống nhất định, các ký tự đặc biệt được liệt kê ở trên sẽ không phải được coi là siêu ký tự, "mà không giải thích điều gì sẽ xảy ra nếu một người cố gắng trốn thoát họ. Trong ngắn hạn, câu hỏi này xứng đáng là một câu trả lời hay. - Aleksandr Dubinsky
"mọi thứ giữa chúng [\Q và \E] được coi là đã thoát "- ngoại trừ khác \Q'cát \E's (có khả năng có thể xảy ra trong regex gốc). Vì vậy, tốt hơn nên sử dụng Pattern.quote như đề xuất đây và không tái tạo lại bánh xe. - Sasha


  • Các ký tự Java phải được thoát trong các biểu thức chính quy là:
    \.[]{}()<>*+-=?^$|
  • Hai trong số các dấu ngoặc đóng (] và }) chỉ cần được thoát sau khi mở cùng một loại khung.
  • Trong []-brackets một số ký tự (như + và -đôi khi làm việc mà không cần trốn thoát.

61
2017-10-07 05:03



Có cách nào để trốn thoát nhưng cho phép những nhân vật đó không? - Dominika
Thoát một ký tự có nghĩa là cho phép ký tự thay vì diễn giải nó như một toán tử. - Tobi G.
Không thoát - trong [] có thể không phải lúc nào cũng hoạt động vì nó được sử dụng để xác định dải ô. Đó là an toàn hơn để thoát khỏi nó. Ví dụ, các mẫu [-] và [-)] phù hợp với chuỗi - nhưng không phải với [(-)]. - Kenston Choi


Để trốn thoát bạn chỉ có thể sử dụng điều này từ Java 1.5:

Pattern.quote("$test");

Bạn sẽ khớp chính xác từ $test


18
2018-05-13 18:02





Theo Chuỗi văn học / Metacharacters trang tài liệu, chúng là:

<([{\^-=$!|]})?*+.>

Ngoài ra nó sẽ được mát mẻ để có danh sách đó refereed một nơi nào đó trong mã, nhưng tôi không biết nơi mà có thể được ...


14
2017-12-13 00:53



String escaped = tnk.replaceAll("[\\<\\(\\[\\{\\\\\\^\\-\\=\\$\\!\\|\\]\\}\\)\\?\\*\\+\\.\\>]", "\\\\$0"); - marbel82
Mẫu javadoc cho biết đó là lỗi khi sử dụng dấu gạch chéo ngược trước bất kỳ ký tự chữ cái nào không biểu thị cấu trúc đã thoát, nhưng dấu gạch chéo ngược có thể được sử dụng trước một ký tự không phải chữ cái bất kể ký tự đó có phải là một phần của cấu trúc không thoát. Do đó, một regex đơn giản hơn sẽ đủ: s.replaceAll("[\\W]", "\\\\$0") Ở đâu \W chỉ định các ký tự không phải từ. - Joe Bowbeer


Theo đề xuất của @ Sorin về tài liệu mẫu Java, có vẻ như ký tự thoát ra ít nhất là:

\.[{(*+?^$|

5
2018-02-12 04:17



String escaped = regexString.replaceAll("([\\\\\\.\\[\\{\\(\\*\\+\\?\\^\\$\\|])", "\\\\$1"); - fracz
) cũng phải được thoát, và tùy thuộc vào việc bạn đang ở trong hay ngoài lớp nhân vật, có thể có nhiều nhân vật hơn để trốn thoát, trong trường hợp đó Pattern.quote làm một công việc khá tốt khi thoát một chuỗi để sử dụng cả bên trong và bên ngoài lớp nhân vật. - nhahtdh


Kết hợp những gì mọi người đã nói, tôi đề nghị những điều sau đây, để giữ danh sách các ký tự đặc biệt cho RegExp được liệt kê rõ ràng trong chuỗi của riêng họ, và tránh phải cố gắng phân tích bằng mắt hàng nghìn "\\". Điều này dường như làm việc khá tốt cho tôi:

final String regExSpecialChars = "<([{\\^-=$!|]})?*+.>";
final String regExSpecialCharsRE = regExSpecialChars.replaceAll( ".", "\\\\$0");
final Pattern reCharsREP = Pattern.compile( "[" + regExSpecialCharsRE + "]");

String quoteRegExSpecialChars( String s)
{
    Matcher m = reCharsREP.matcher( s);
    return m.replaceAll( "\\\\$0");
}

4
2018-04-01 06:22





ở phía bên kia của đồng tiền, bạn nên sử dụng regex "non-char" trông như thế này nếu các ký tự đặc biệt = allChars - number - ABC - dấu cách trong ngữ cảnh ứng dụng của bạn.

String regepx = "[^\\s\\w]*";

1
2018-01-03 07:39





Không chắc tôi hoàn toàn hiểu câu hỏi của bạn, nhưng tôi nghĩ bạn nên xem xét Matcher.quoteReplacement ()


0
2018-01-03 07:19



giả sử tôi đang cố gắng để phù hợp. (dấu chấm) trong regex. Tôi tin rằng nó cần phải được trốn thoát vì nó có một số ý nghĩa khác trong regex. Vì vậy, tôi cần phải biết tất cả các nhân vật cần phải được trốn thoát. - Avinash Nair
.......... wat? - mkoryak
Xin lỗi, Điều đó đã được đăng do nhầm lẫn! Tôi có thể tìm danh sách đầy đủ các ký tự thoát trong regex java ở đâu? - Avinash Nair
@mkoryak google mang đến cho bạn ở đây. thở dài - corsiKa