From af8e8c185a7711b14680953fe1b4d43449673c0d Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Wed, 20 May 2015 07:35:45 +0000 Subject: [PATCH] * make sure longest OR expressions is captured --- source/net/filebot/media/ReleaseInfo.java | 28 +++++++++----------- source/net/filebot/util/StringUtilities.java | 23 ++++++++-------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/source/net/filebot/media/ReleaseInfo.java b/source/net/filebot/media/ReleaseInfo.java index 7c53f894..6183de21 100644 --- a/source/net/filebot/media/ReleaseInfo.java +++ b/source/net/filebot/media/ReleaseInfo.java @@ -229,21 +229,19 @@ public class ReleaseInfo { folders.add(it); } } - structureRootFolderPattern = compile(join(folders, "|"), CASE_INSENSITIVE | UNICODE_CHARACTER_CLASS); + structureRootFolderPattern = compile(or(folders.toArray()), CASE_INSENSITIVE | UNICODE_CHARACTER_CLASS); } return structureRootFolderPattern; } public Pattern getLanguageTagPattern(Collection languages) { // [en] - return compile("(?<=[-\\[{(])(" + join(quoteAll(languages), "|") + ")(?=\\p{Punct})", CASE_INSENSITIVE | UNICODE_CHARACTER_CLASS); + return compile("(?<=[-\\[{(])" + or(quoteAll(languages)) + "(?=\\p{Punct})", CASE_INSENSITIVE | UNICODE_CHARACTER_CLASS); } public Pattern getLanguageSuffixPattern(Collection languages, boolean strict) { // e.g. ".en.srt" or ".en.forced.srt" - String language = join(quoteAll(languages), "|"); - String tag = getProperty("pattern.subtitle.tags"); - return compile("(?<=[.-])(" + language + ")(?=([.-](" + tag + "))?$)", strict ? 0 : CASE_INSENSITIVE | UNICODE_CHARACTER_CLASS); + return compile("(?<=[.-])" + or(quoteAll(languages)) + "(?=([.-](" + getProperty("pattern.subtitle.tags") + "))?$)", strict ? 0 : CASE_INSENSITIVE | UNICODE_CHARACTER_CLASS); } public Pattern getResolutionPattern() { @@ -277,21 +275,21 @@ public class ReleaseInfo { public Pattern getReleaseGroupPattern(boolean strict) throws IOException { // pattern matching any release group name enclosed in separators - return compile("(? terms) throws IOException { - return compile("(? quoteAll(Collection strings) { - List patterns = new ArrayList(strings.size()); - for (String it : strings) { - patterns.add(Pattern.quote(it)); - } - return patterns; + private String or(Object[] terms) { + return joinSorted(terms, "|", reverseOrder(), "(", ")"); // non-capturing group that matches the longest occurrence + } + + private String[] quoteAll(Collection values) { + return values.stream().map((s) -> Pattern.quote(s)).toArray(String[]::new); } public Map getLanguageMap(Locale... supportedDisplayLocale) { diff --git a/source/net/filebot/util/StringUtilities.java b/source/net/filebot/util/StringUtilities.java index 94ab6f10..b967a913 100644 --- a/source/net/filebot/util/StringUtilities.java +++ b/source/net/filebot/util/StringUtilities.java @@ -2,6 +2,8 @@ package net.filebot.util; import static java.util.Arrays.*; +import java.util.Arrays; +import java.util.Comparator; import java.util.Iterator; public final class StringUtilities { @@ -10,33 +12,32 @@ public final class StringUtilities { return object == null ? null : object.toString(); } - public static boolean isEmptyValue(Object object) { + public static boolean isEmpty(Object object) { return object == null || object.toString().length() == 0; } - public static String joinBy(CharSequence delimiter, Object... values) { - return join(asList(values), delimiter); - } - public static String join(Object[] values, CharSequence delimiter) { - return join(asList(values), delimiter); + return join(asList(values), delimiter, "", ""); } - public static String join(Iterable values, CharSequence delimiter) { - StringBuilder sb = new StringBuilder(); + public static String joinSorted(Object[] values, CharSequence delimiter, Comparator sort, CharSequence start, CharSequence end) { + return join(Arrays.stream(values).sorted(sort)::iterator, delimiter, start, end); + } + + public static String join(Iterable values, CharSequence delimiter, CharSequence start, CharSequence end) { + StringBuilder sb = new StringBuilder().append(start); for (Iterator iterator = values.iterator(); iterator.hasNext();) { Object value = iterator.next(); - if (!isEmptyValue(value)) { + if (!isEmpty(value)) { if (sb.length() > 0) { sb.append(delimiter); } - sb.append(value); } } - return sb.toString(); + return sb.append(end).toString(); } /**