package org.jabref.model.search.rules; import java.util.Locale; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.jabref.model.entry.BibEntry; /** * Search rule for regex-based search. */ public class RegexBasedSearchRule implements SearchRule { private final boolean caseSensitive; public RegexBasedSearchRule(boolean caseSensitive) { this.caseSensitive = caseSensitive; } public boolean isCaseSensitive() { return caseSensitive; } @Override public boolean validateSearchStrings(String query) { String searchString = query; if (!caseSensitive) { searchString = searchString.toLowerCase(Locale.ROOT); } try { Pattern.compile(searchString, caseSensitive ? 0 : Pattern.CASE_INSENSITIVE); } catch (PatternSyntaxException ex) { return false; } return true; } @Override public boolean applyRule(String query, BibEntry bibEntry) { Pattern pattern; try { pattern = Pattern.compile(query, caseSensitive ? 0 : Pattern.CASE_INSENSITIVE); } catch (PatternSyntaxException ex) { return false; } for (String field : bibEntry.getFieldNames()) { Optional<String> fieldOptional = bibEntry.getField(field); if (fieldOptional.isPresent()) { String fieldContentNoBrackets = bibEntry.getLatexFreeField(field).get(); Matcher m = pattern.matcher(fieldContentNoBrackets); if (m.find()) { return true; } } } return false; } }