Нет, [\w\W]
соответствует всему, в то время как .
соответствует всему, кроме разрыва строки. Поэтому я не думаю, что вы можете получить что-нибудь, переключая их.
Вы можете использовать
.*?amazon.*?desktop-dp.*?
за неохотный поиск, но я не думаю, что это поможет. Вместо сопоставления этому регулярному выражению вы можете использовать метод, подобный
boolean hasTwoSubstringsInOrder(String haystack, String needle1, String needle2) {
int index1 = heystack.indexOf(needle1);
if (index1 == -1) return false;
int index2 = heystack.lastIndexOf(needle2);
if (index2 == -1) return false;
return index1 + needle1.length() <= index2;
}
, что, скорее всего, будет быстрее, хотя усиления может быть недостаточно. Учитывая огромное количество URL-адресов, вы можете использовать некоторую предварительную обработку, такую как извлечение всех соответствующих токенов, возможно, используя что-то вроде string.split("[^-a-zA-Z0-9]")
(но используя Pattern.compile
).
Очевидно, что ваш шаблон может совпадать только тогда, когда URL содержит и amazon
, и desktop-dp
. Если ваш набор данных не такой большой, я бы порекомендовал что-то вроде Multimap<String, String> tokenMap
, сопоставляющее токены с набором URL-адресов и использующее меньшие из tokenMap.get("amazon")
и tokenMap.get("desktop-dp")
для дальнейшей обработки. Я ничего не знаю о свечах, но готов поспорить, что это что-то вроде этого.