Tak, można to zrobić za pomocą wyrażenia regularnego. Należy pamiętać, że wyrażenia regularne języka Java mają inną składnię niż "podobny" język SQL. Zamiast "%
", masz ".*
", a zamiast "?
", masz ".
".
To, co czyni nieco trudnym, jest to, że musiałbyś uciec od znaków, które Java traktuje jako wyjątkowe. Ponieważ próbujesz zrobić to analogicznie do SQL, domyślam się, że ^$[]{}\
nie powinien pojawić się w ciągu regex. Ale musisz zastąpić ".
" "\\.
" przed wykonaniem jakichkolwiek innych zamienników. (Edit:Pattern.quote(String)
ucieka wszystko przez otaczający łańcuch z „\Q
” i „\E
”, co spowoduje, że wszystko w wyrażeniu być traktowany jako literał (bez symboli wieloznacznych w ogóle) Więc zdecydowanie nie chcą. używać tego.)
Ponadto, jak mówi Dave Webb, należy również zignorować przypadek.
Mając to na uwadze, oto próbka tego, co to może wyglądać:
public static boolean like(String str, String expr) {
expr = expr.toLowerCase(); // ignoring locale for now
expr = expr.replace(".", "\\."); // "\\" is escaped to "\" (thanks, Alan M)
// ... escape any other potentially problematic characters here
expr = expr.replace("?", ".");
expr = expr.replace("%", ".*");
str = str.toLowerCase();
return str.matches(expr);
}
tak, dzięki! Ale na wypadek, gdyby słowo nie było takie proste jak "% dig%", a ciąg wymaga ucieczki? Czy coś już się exsiting? A co z '?' ? – Chris
Edytowałem swoją odpowiedź dla operatora znaku zapytania. Trochę jestem jednak zdezorientowany przez resztę twojego komentarza. Czy mówisz, że ciąg przychodzi do ciebie w składni sql i chcesz go ocenić tak jak jest? Jeśli tak jest, myślę, że będziesz musiał ręcznie zastąpić składnię sql. – Bob
co się stanie, jeśli ciąg znaków, który jest używany jako wzorzec wyszukiwania, zawiera znaki grupujące, takie jak "(" lub ")"? w jaki sposób inne postacie potrzebują ucieczki? – Chris