diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml
index 93828fef592..4b5d71480cf 100644
--- a/config/checkstyle/checkstyle.xml
+++ b/config/checkstyle/checkstyle.xml
@@ -70,6 +70,17 @@
+
+
+
+
+
+
+
+
diff --git a/jabgui/src/main/java/org/jabref/gui/maintable/ExtractReferencesAction.java b/jabgui/src/main/java/org/jabref/gui/maintable/ExtractReferencesAction.java
index 75c18152ed0..733e1908660 100644
--- a/jabgui/src/main/java/org/jabref/gui/maintable/ExtractReferencesAction.java
+++ b/jabgui/src/main/java/org/jabref/gui/maintable/ExtractReferencesAction.java
@@ -39,6 +39,8 @@
///
/// The mode is selected by the preferences whether to use Grobid or not.
public class ExtractReferencesAction extends SimpleCommand {
+ private static final Pattern COMMENT_NUMBER_PATTERN = Pattern.compile("^\\[(\\d+)\\]");
+
private final int FILES_LIMIT = 10;
private final DialogService dialogService;
@@ -182,8 +184,7 @@ private static String getCites(List entries, BibEntry currentEntry) {
String newCitationKey;
// Could happen if no author and no year is present
// We use the number of the comment field (because there is no other way to get the number reliable)
- Pattern pattern = Pattern.compile("^\\[(\\d+)\\]");
- Matcher matcher = pattern.matcher(importedEntry.getField(StandardField.COMMENT).orElse(""));
+ Matcher matcher = COMMENT_NUMBER_PATTERN.matcher(importedEntry.getField(StandardField.COMMENT).orElse(""));
if (matcher.hasMatch()) {
newCitationKey = sourceCitationKey + "-" + matcher.group(1);
} else {
diff --git a/jabgui/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java b/jabgui/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java
index 7ed767d8653..62744721a39 100644
--- a/jabgui/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java
+++ b/jabgui/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java
@@ -62,6 +62,9 @@
public class PreviewTabViewModel implements PreferenceTabViewModel {
private static final Logger LOGGER = LoggerFactory.getLogger(PreviewTabViewModel.class);
+ private static final Pattern XML_TAG_PATTERN = Pattern.compile("(?(?\\h*)(\\w+)([^<>]*)(\\h*/?>))"
+ + "|(?)");
+ private static final Pattern XML_ATTRIBUTES_PATTERN = Pattern.compile("(\\w+\\h*)(=)(\\h*\"[^\"]+\")");
private final BooleanProperty showAsExtraTabProperty = new SimpleBooleanProperty(false);
private final BooleanProperty showPreviewInEntryTableTooltip = new SimpleBooleanProperty(false);
@@ -330,10 +333,6 @@ public void resetDefaultLayout() {
/// @param text to parse and highlight
/// @return highlighted span for codeArea
public StyleSpans> computeHighlighting(String text) {
- final Pattern XML_TAG = Pattern.compile("(?(?\\h*)(\\w+)([^<>]*)(\\h*/?>))"
- + "|(?)");
- final Pattern ATTRIBUTES = Pattern.compile("(\\w+\\h*)(=)(\\h*\"[^\"]+\")");
-
final int GROUP_OPEN_BRACKET = 2;
final int GROUP_ELEMENT_NAME = 3;
final int GROUP_ATTRIBUTES_SECTION = 4;
@@ -342,7 +341,7 @@ public StyleSpans> computeHighlighting(String text) {
final int GROUP_EQUAL_SYMBOL = 2;
final int GROUP_ATTRIBUTE_VALUE = 3;
- Matcher matcher = XML_TAG.matcher(text);
+ Matcher matcher = XML_TAG_PATTERN.matcher(text);
int lastKeywordEnd = 0;
StyleSpansBuilder> spansBuilder = new StyleSpansBuilder<>();
while (matcher.find()) {
@@ -359,7 +358,7 @@ public StyleSpans> computeHighlighting(String text) {
if (!attributesText.isEmpty()) {
lastKeywordEnd = 0;
- Matcher attributesMatcher = ATTRIBUTES.matcher(attributesText);
+ Matcher attributesMatcher = XML_ATTRIBUTES_PATTERN.matcher(attributesText);
while (attributesMatcher.find()) {
spansBuilder.add(List.of(), attributesMatcher.start() - lastKeywordEnd);
spansBuilder.add(Set.of("attribute"), attributesMatcher.end(GROUP_ATTRIBUTE_NAME) - attributesMatcher.start(GROUP_ATTRIBUTE_NAME));
diff --git a/jablib/src/main/java/org/jabref/logic/ai/chatting/FollowUpQuestionGenerator.java b/jablib/src/main/java/org/jabref/logic/ai/chatting/FollowUpQuestionGenerator.java
index 3ed8d70ed07..5f119a962b2 100644
--- a/jablib/src/main/java/org/jabref/logic/ai/chatting/FollowUpQuestionGenerator.java
+++ b/jablib/src/main/java/org/jabref/logic/ai/chatting/FollowUpQuestionGenerator.java
@@ -18,6 +18,7 @@ public class FollowUpQuestionGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(FollowUpQuestionGenerator.class);
private static final int MIN_QUESTION_LENGTH = 5;
private static final int MAX_QUESTION_LENGTH = 100;
+ private static final Pattern NUMBERED_PATTERN = Pattern.compile("^\\s*\\d+\\.\\s*(.+)$", Pattern.MULTILINE);
private final ChatModel chatLanguageModel;
private final AiTemplatesService aiTemplatesService;
@@ -58,8 +59,7 @@ private String buildPrompt(String userMessage, String aiResponse) {
private List parseQuestions(String response) {
List questions = new ArrayList<>();
- Pattern numberedPattern = Pattern.compile("^\\s*\\d+\\.\\s*(.+)$", Pattern.MULTILINE);
- Matcher matcher = numberedPattern.matcher(response);
+ Matcher matcher = NUMBERED_PATTERN.matcher(response);
while (matcher.find() && questions.size() < aiPreferences.getFollowUpQuestionsCount()) {
String question = matcher.group(1).trim();
diff --git a/jablib/src/main/java/org/jabref/logic/importer/fileformat/CoinsParser.java b/jablib/src/main/java/org/jabref/logic/importer/fileformat/CoinsParser.java
index 246a125feb2..0fad0f12609 100644
--- a/jablib/src/main/java/org/jabref/logic/importer/fileformat/CoinsParser.java
+++ b/jablib/src/main/java/org/jabref/logic/importer/fileformat/CoinsParser.java
@@ -20,15 +20,15 @@
/// implemented by reverse-engineering the implementation by CiteSeerX
public class CoinsParser implements Parser {
- private final Pattern DOI = Pattern.compile("%3Fdoi%3D([^&]+)");
- private final Pattern TITLE = Pattern.compile("&rft.atitle=([^&]+)");
- private final Pattern JOURNAL = Pattern.compile("&rft.jtitle=([^&]+)");
- private final Pattern YEAR = Pattern.compile("&rft.date=([^&]+)");
- private final Pattern VOLUME = Pattern.compile("&rft.volume=([^&]+)");
- private final Pattern PAGES = Pattern.compile("&rft.pages=([^&]+)");
- private final Pattern ISSUE = Pattern.compile("&rft.issue=([^&]+)");
- private final Pattern TYPE = Pattern.compile("&rft.genre=([^&]+)");
- private final Pattern AUTHOR = Pattern.compile("&rft.au=([^&]+)");
+ private static final Pattern DOI = Pattern.compile("%3Fdoi%3D([^&]+)");
+ private static final Pattern TITLE = Pattern.compile("&rft.atitle=([^&]+)");
+ private static final Pattern JOURNAL = Pattern.compile("&rft.jtitle=([^&]+)");
+ private static final Pattern YEAR = Pattern.compile("&rft.date=([^&]+)");
+ private static final Pattern VOLUME = Pattern.compile("&rft.volume=([^&]+)");
+ private static final Pattern PAGES = Pattern.compile("&rft.pages=([^&]+)");
+ private static final Pattern ISSUE = Pattern.compile("&rft.issue=([^&]+)");
+ private static final Pattern TYPE = Pattern.compile("&rft.genre=([^&]+)");
+ private static final Pattern AUTHOR = Pattern.compile("&rft.au=([^&]+)");
@Override
public List parseEntries(InputStream inputStream) throws ParseException {
diff --git a/jablib/src/main/java/org/jabref/logic/integrity/PagesChecker.java b/jablib/src/main/java/org/jabref/logic/integrity/PagesChecker.java
index b96fba62a06..f39b9add3c2 100644
--- a/jablib/src/main/java/org/jabref/logic/integrity/PagesChecker.java
+++ b/jablib/src/main/java/org/jabref/logic/integrity/PagesChecker.java
@@ -34,13 +34,16 @@ public class PagesChecker implements ValueChecker {
+ ")?"
+ "\\z"; // end String
+ private static final Predicate IS_VALID_PAGE_NUMBER_BIBTEX = Pattern.compile(PAGES_EXP_BIBTEX).asPredicate();
+ private static final Predicate IS_VALID_PAGE_NUMBER_BIBLATEX = Pattern.compile(PAGES_EXP_BIBLATEX).asPredicate();
+
private final Predicate isValidPageNumber;
public PagesChecker(BibDatabaseContext databaseContext) {
if (databaseContext.isBiblatexMode()) {
- isValidPageNumber = Pattern.compile(PAGES_EXP_BIBLATEX).asPredicate();
+ isValidPageNumber = IS_VALID_PAGE_NUMBER_BIBLATEX;
} else {
- isValidPageNumber = Pattern.compile(PAGES_EXP_BIBTEX).asPredicate();
+ isValidPageNumber = IS_VALID_PAGE_NUMBER_BIBTEX;
}
}
diff --git a/jablib/src/main/java/org/jabref/logic/msbib/MSBibEntry.java b/jablib/src/main/java/org/jabref/logic/msbib/MSBibEntry.java
index 5da0cf99ef3..41df41774e5 100644
--- a/jablib/src/main/java/org/jabref/logic/msbib/MSBibEntry.java
+++ b/jablib/src/main/java/org/jabref/logic/msbib/MSBibEntry.java
@@ -26,6 +26,13 @@
/// @see ECMA Standard
class MSBibEntry {
+ /// reduced subset, supports only "CITY , STATE, COUNTRY"
+ /// **\b(\w+)\s?[,]?\s?(\w+)\s?[,]?\s?(\w*)\b**
+ /// WORD SPACE , SPACE WORD SPACE (Can be zero or more) , SPACE WORD (Can be zero or more)
+ /// Matches both single locations (only city) like Berlin and full locations like Stroudsburg, PA, USA
+ /// tested using http://www.regexpal.com/
+ private static final Pattern ADDRESS_PATTERN = Pattern.compile("\\b(\\w+)\\s?[,]?\\s?(\\w*)\\s?[,]?\\s?(\\w*)\\b");
+
public Map fields = new HashMap<>();
public List authors;
@@ -65,13 +72,6 @@ class MSBibEntry {
private String bibtexEntryType;
- /// reduced subset, supports only "CITY , STATE, COUNTRY"
- /// **\b(\w+)\s?[,]?\s?(\w+)\s?[,]?\s?(\w*)\b**
- /// WORD SPACE , SPACE WORD SPACE (Can be zero or more) , SPACE WORD (Can be zero or more)
- /// Matches both single locations (only city) like Berlin and full locations like Stroudsburg, PA, USA
- /// tested using http://www.regexpal.com/
- private final Pattern ADDRESS_PATTERN = Pattern.compile("\\b(\\w+)\\s?[,]?\\s?(\\w*)\\s?[,]?\\s?(\\w*)\\b");
-
public MSBibEntry() {
// empty
}
diff --git a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java
index 606b71321c3..812f1537602 100644
--- a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java
+++ b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java
@@ -40,6 +40,7 @@
public class CSLCitationOOAdapter {
private static final CitationStyleOutputFormat HTML_OUTPUT_FORMAT = CitationStyleOutputFormat.HTML;
+ private static final Pattern CITATION_NUMBER_PATTERN = Pattern.compile("(\\D*)(\\d+)(\\D*)");
private final XTextDocument document;
private final CSLReferenceMarkManager markManager;
@@ -259,8 +260,7 @@ private void insertReferences(XTextCursor cursor, List entries, OOText
/// Transforms the numbers in the citation to globally-unique (and thus, reusable) numbers.
private String updateSingleOrMultipleCitationNumbers(String citation, List entries) {
- Pattern pattern = Pattern.compile("(\\D*)(\\d+)(\\D*)");
- Matcher matcher = pattern.matcher(citation);
+ Matcher matcher = CITATION_NUMBER_PATTERN.matcher(citation);
StringBuilder sb = new StringBuilder();
Iterator iterator = entries.iterator();
diff --git a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java
index 02ab703b0c1..c5339f20bc5 100644
--- a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java
+++ b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java
@@ -48,6 +48,7 @@ public final class CSLFormatUtils {
private static final String DEFAULT_HANGING_INDENT_BIBLIOGRAPHY_BODY_FORMAT = "Hanging indent";
private static final Pattern YEAR_IN_CITATION_PATTERN = Pattern.compile("(.)(.*), (\\d{4}.*)");
+ private static final Pattern BIBLIOGRAPHY_NUMBER_PATTERN = Pattern.compile("([\\[(])?(\\d+)([])])?(\\.)?\\s*");
private CSLFormatUtils() {
// prevent instantiation
@@ -168,8 +169,7 @@ public static String generateAlphanumericInTextCitation(BibEntry entry, BibDatab
/// @param currentNumber the correct number to update the citation with.
/// @return the bibliographic citation with resolved number.
public static String updateSingleBibliographyNumber(String citation, int currentNumber) {
- Pattern pattern = Pattern.compile("([\\[(])?(\\d+)([])])?(\\.)?\\s*");
- Matcher matcher = pattern.matcher(citation);
+ Matcher matcher = BIBLIOGRAPHY_NUMBER_PATTERN.matcher(citation);
StringBuilder sb = new StringBuilder();
boolean numberReplaced = false;
diff --git a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java
index 3653f336d3e..92795227e30 100644
--- a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java
+++ b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java
@@ -40,6 +40,7 @@
/// Class for generation, insertion and management of all reference marks in the document.
public class CSLReferenceMarkManager {
private static final Logger LOGGER = LoggerFactory.getLogger(CSLReferenceMarkManager.class);
+ private static final Pattern CITATION_NUMBER_PATTERN = Pattern.compile("(\\D*)(\\d+)(\\D*)");
private final XTextDocument document;
private final XMultiServiceFactory factory;
@@ -227,8 +228,7 @@ private void updateAllCitationNumbers() throws Exception, CreationException {
}
private String getUpdatedCitationTextWithNewNumbers(String currentText, List newNumbers) {
- Pattern pattern = Pattern.compile("(\\D*)(\\d+)(\\D*)");
- Matcher matcher = pattern.matcher(currentText);
+ Matcher matcher = CITATION_NUMBER_PATTERN.matcher(currentText);
StringBuilder result = new StringBuilder();
int lastEnd = 0;
int numberIndex = 0;
diff --git a/jablib/src/main/java/org/jabref/logic/util/strings/StringUtil.java b/jablib/src/main/java/org/jabref/logic/util/strings/StringUtil.java
index 1ccb290d343..db54a63652b 100644
--- a/jablib/src/main/java/org/jabref/logic/util/strings/StringUtil.java
+++ b/jablib/src/main/java/org/jabref/logic/util/strings/StringUtil.java
@@ -49,6 +49,8 @@ public class StringUtil {
private static final UnicodeToReadableCharMap UNICODE_CHAR_MAP = new UnicodeToReadableCharMap();
private static final String WRAPPED_LINE_PREFIX = ""; // If a line break is added, this prefix will be inserted at the beginning of the next line
private static final String STRING_TABLE_DELIMITER = " : ";
+ // A sentence ends with a .?!;, but not in the case of "Mr.", "Ms.", "Mrs.", "Dr.", "st.", "jr.", "co.", "inc.", and "ltd."
+ private static final Pattern SPLIT_TEXT_PATTERN = Pattern.compile("(?<=[\\.!;\\?])(? getStringAsWords(String text) {
/// Returns a list of sentences contained in the given text.
public static List getStringAsSentences(String text) {
- // A sentence ends with a .?!;, but not in the case of "Mr.", "Ms.", "Mrs.", "Dr.", "st.", "jr.", "co.", "inc.", and "ltd."
- Pattern splitTextPattern = Pattern.compile("(?<=[\\.!;\\?])(?\\d{4}\\.\\d{4,5})(v(?\\d+))?\\s?(\\[(?\\S+)\\])?");
+ private static final Pattern OLD_IDENTIFIER_PATTERN = Pattern.compile("(" + ARXIV_PREFIX + ")?\\s?:?\\s?(?(?[a-z\\-]+(\\.[A-Z]{2})?)/\\d{7})(v(?\\d+))?");
+
private final String identifier;
private final String classification;
private final String version;
@@ -45,8 +47,7 @@ public static Optional parse(String value) {
return getArXivIdentifier(identifierMatcher);
}
- Pattern oldIdentifierPattern = Pattern.compile("(" + ARXIV_PREFIX + ")?\\s?:?\\s?(?(?[a-z\\-]+(\\.[A-Z]{2})?)/\\d{7})(v(?\\d+))?");
- Matcher oldIdentifierMatcher = oldIdentifierPattern.matcher(identifier);
+ Matcher oldIdentifierMatcher = OLD_IDENTIFIER_PATTERN.matcher(identifier);
if (oldIdentifierMatcher.matches()) {
return getArXivIdentifier(oldIdentifierMatcher);
}
diff --git a/jablib/src/main/java/org/jabref/model/entry/identifier/IacrEprint.java b/jablib/src/main/java/org/jabref/model/entry/identifier/IacrEprint.java
index cf2e037d768..d86b35fbdd7 100644
--- a/jablib/src/main/java/org/jabref/model/entry/identifier/IacrEprint.java
+++ b/jablib/src/main/java/org/jabref/model/entry/identifier/IacrEprint.java
@@ -18,16 +18,19 @@
@AllowedToUseLogic("Because URL utility is needed")
public class IacrEprint implements Identifier {
public static final URI RESOLVER = URLUtil.createUri("https://ia.cr");
+
private static final Logger LOGGER = LoggerFactory.getLogger(IacrEprint.class);
private static final String IACR_EPRINT_EXP = "\\d{4}\\/\\d{3,5}";
+ private static final Pattern IACR_EPRINT_PATTERN = Pattern.compile(IACR_EPRINT_EXP);
+
private final String iacrEprint;
IacrEprint(@NonNull String iacrEprint) {
String trimmedId = iacrEprint.trim();
if (matchesExcepted(trimmedId)) {
- Matcher matcher = Pattern.compile(IACR_EPRINT_EXP).matcher(trimmedId);
+ Matcher matcher = IACR_EPRINT_PATTERN.matcher(trimmedId);
matcher.find();
this.iacrEprint = matcher.group(0);
} else {
diff --git a/jablib/src/test/java/org/jabref/logic/importer/ImporterTest.java b/jablib/src/test/java/org/jabref/logic/importer/ImporterTest.java
index ac4a164da39..9c9bfb329e4 100644
--- a/jablib/src/test/java/org/jabref/logic/importer/ImporterTest.java
+++ b/jablib/src/test/java/org/jabref/logic/importer/ImporterTest.java
@@ -33,6 +33,8 @@
@ResourceLock("Localization.lang")
public class ImporterTest {
+ private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s");
+
@ParameterizedTest
@MethodSource("instancesToTest")
void getFormatterNameDoesNotReturnNull(Importer format) {
@@ -54,8 +56,7 @@ void getIdDoesNotReturnNull(Importer format) {
@ParameterizedTest
@MethodSource("instancesToTest")
void getIdDoesNotContainWhitespace(Importer format) {
- Pattern whitespacePattern = Pattern.compile("\\s");
- assertFalse(whitespacePattern.matcher(format.getId()).find());
+ assertFalse(WHITESPACE_PATTERN.matcher(format.getId()).find());
}
@ParameterizedTest
diff --git a/jabls/src/main/java/org/jabref/languageserver/util/definition/MarkdownDefinitionProvider.java b/jabls/src/main/java/org/jabref/languageserver/util/definition/MarkdownDefinitionProvider.java
index 9571156fbdf..3e6121caeed 100644
--- a/jabls/src/main/java/org/jabref/languageserver/util/definition/MarkdownDefinitionProvider.java
+++ b/jabls/src/main/java/org/jabref/languageserver/util/definition/MarkdownDefinitionProvider.java
@@ -6,9 +6,12 @@
public class MarkdownDefinitionProvider extends DefinitionProvider {
+ private static final Pattern CITATION_COMMAND_PATTERN = Pattern.compile("(?\\[[^\\]]*@[^\\]]*\\]|@[a-z0-9_.+:-]+(?:\\s*;\\s*@[a-z0-9_.+:-]+)*)", Pattern.CASE_INSENSITIVE);
+ private static final Pattern CITATION_KEY_INSIDE_PATTERN = Pattern.compile("@(?[a-z0-9_.+:-]+)", Pattern.CASE_INSENSITIVE);
+
public MarkdownDefinitionProvider(LspParserHandler parserHandler) {
super(parserHandler);
- this.citationCommandPattern = Pattern.compile("(?\\[[^\\]]*@[^\\]]*\\]|@[a-z0-9_.+:-]+(?:\\s*;\\s*@[a-z0-9_.+:-]+)*)", Pattern.CASE_INSENSITIVE);
- this.citationKeyInsidePattern = Pattern.compile("@(?[a-z0-9_.+:-]+)", Pattern.CASE_INSENSITIVE);
+ this.citationCommandPattern = CITATION_COMMAND_PATTERN;
+ this.citationKeyInsidePattern = CITATION_KEY_INSIDE_PATTERN;
}
}