From bc667a64741cdafecb77d01b1d1120236b914b64 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sat, 24 Aug 2024 17:23:10 +0200 Subject: [PATCH] Use static QRegularExpression --- ext/libstrawberry-common/core/logging.cpp | 4 +- src/collection/collectionbackend.cpp | 5 ++- src/collection/collectionmodel.cpp | 3 +- src/core/database.cpp | 3 +- src/core/localredirectserver.cpp | 2 +- .../albumcoverchoicecontroller.cpp | 6 ++- src/device/giolister.cpp | 9 +++-- src/device/mtpconnection.cpp | 2 +- src/lyrics/azlyricscomlyricsprovider.cpp | 3 +- src/lyrics/elyricsnetlyricsprovider.cpp | 7 +++- src/lyrics/htmllyricsprovider.cpp | 18 ++++++--- src/lyrics/letraslyricsprovider.cpp | 7 +++- src/lyrics/lyricfindlyricsprovider.cpp | 7 +++- src/lyrics/musixmatchlyricsprovider.cpp | 3 +- src/lyrics/songlyricscomlyricsprovider.cpp | 10 +++-- src/organize/organizeformat.cpp | 8 +++- src/osd/osddbus.cpp | 3 +- src/playlistparsers/asxparser.cpp | 5 ++- src/playlistparsers/cueparser.cpp | 4 +- src/playlistparsers/parserbase.cpp | 3 +- src/playlistparsers/plsparser.cpp | 2 +- src/providers/musixmatchprovider.cpp | 10 +++-- src/radios/radiomodel.cpp | 3 +- src/radios/radioparadiseservice.cpp | 3 +- src/settings/backendsettingspage.cpp | 38 ++++++++++--------- src/settings/behavioursettingspage.cpp | 2 +- src/streaming/streamingsearchview.cpp | 3 +- src/utilities/coverutils.cpp | 5 ++- src/utilities/filemanagerutils.cpp | 3 +- src/utilities/strutils.cpp | 5 ++- src/utilities/timeutils.cpp | 2 +- 31 files changed, 121 insertions(+), 67 deletions(-) diff --git a/ext/libstrawberry-common/core/logging.cpp b/ext/libstrawberry-common/core/logging.cpp index 85c321efa..d4fb8ef6a 100644 --- a/ext/libstrawberry-common/core/logging.cpp +++ b/ext/libstrawberry-common/core/logging.cpp @@ -314,8 +314,8 @@ QString CXXDemangle(const QString &mangled_function) { QString LinuxDemangle(const QString &symbol); QString LinuxDemangle(const QString &symbol) { - QRegularExpression regex(QStringLiteral("\\(([^+]+)")); - QRegularExpressionMatch match = regex.match(symbol); + static const QRegularExpression regex_symbol(QStringLiteral("\\(([^+]+)")); + QRegularExpressionMatch match = regex_symbol.match(symbol); if (!match.hasMatch()) { return symbol; } diff --git a/src/collection/collectionbackend.cpp b/src/collection/collectionbackend.cpp index 157d2c7fa..67faf6426 100644 --- a/src/collection/collectionbackend.cpp +++ b/src/collection/collectionbackend.cpp @@ -1497,7 +1497,8 @@ CollectionBackend::AlbumList CollectionBackend::GetAlbums(const QString &artist, album_info.art_embedded = query.Value(6).toBool(); const QString art_automatic = query.Value(7).toString(); - if (art_automatic.contains(QRegularExpression(QStringLiteral("..+:.*")))) { + static const QRegularExpression regex_url_schema(QStringLiteral("..+:.*")); + if (art_automatic.contains(regex_url_schema)) { album_info.art_automatic = QUrl::fromEncoded(art_automatic.toUtf8()); } else { @@ -1505,7 +1506,7 @@ CollectionBackend::AlbumList CollectionBackend::GetAlbums(const QString &artist, } const QString art_manual = query.Value(8).toString(); - if (art_manual.contains(QRegularExpression(QStringLiteral("..+:.*")))) { + if (art_manual.contains(regex_url_schema)) { album_info.art_manual = QUrl::fromEncoded(art_manual.toUtf8()); } else { diff --git a/src/collection/collectionmodel.cpp b/src/collection/collectionmodel.cpp index 067816356..ffa438654 100644 --- a/src/collection/collectionmodel.cpp +++ b/src/collection/collectionmodel.cpp @@ -1163,7 +1163,8 @@ QString CollectionModel::SortText(QString text) { else { text = text.toLower(); } - text = text.remove(QRegularExpression(QStringLiteral("[^\\w ]"), QRegularExpression::UseUnicodePropertiesOption)); + static const QRegularExpression regex_not_words(QStringLiteral("[^\\w ]"), QRegularExpression::UseUnicodePropertiesOption); + text = text.remove(regex_not_words); return text; diff --git a/src/core/database.cpp b/src/core/database.cpp index 1b36c7416..5327d046f 100644 --- a/src/core/database.cpp +++ b/src/core/database.cpp @@ -388,7 +388,8 @@ void Database::ExecSchemaCommandsFromFile(QSqlDatabase &db, const QString &filen void Database::ExecSchemaCommands(QSqlDatabase &db, const QString &schema, int schema_version, bool in_transaction) { // Run each command - QStringList commands = schema.split(QRegularExpression(QStringLiteral("; *\n\n"))); + static const QRegularExpression regex_split_commands(QStringLiteral("; *\n\n")); + QStringList commands = schema.split(regex_split_commands); // We don't want this list to reflect possible DB schema changes, so we initialize it before executing any statements. // If no outer transaction is provided the song tables need to be queried before beginning an inner transaction! diff --git a/src/core/localredirectserver.cpp b/src/core/localredirectserver.cpp index 44e57439a..2d061045f 100644 --- a/src/core/localredirectserver.cpp +++ b/src/core/localredirectserver.cpp @@ -129,7 +129,7 @@ void LocalRedirectServer::WriteTemplate() const { QString page_data = QString::fromUtf8(page_file.readAll()); page_file.close(); - QRegularExpression tr_regexp(QStringLiteral("tr\\(\"([^\"]+)\"\\)")); + static const QRegularExpression tr_regexp(QStringLiteral("tr\\(\"([^\"]+)\"\\)")); qint64 offset = 0; forever { QRegularExpressionMatch re_match = tr_regexp.match(page_data, offset); diff --git a/src/covermanager/albumcoverchoicecontroller.cpp b/src/covermanager/albumcoverchoicecontroller.cpp index 2858ac096..34256fa6b 100644 --- a/src/covermanager/albumcoverchoicecontroller.cpp +++ b/src/covermanager/albumcoverchoicecontroller.cpp @@ -240,8 +240,10 @@ void AlbumCoverChoiceController::SaveCoverToFileManual(const Song &song, const A } initial_file_name = initial_file_name + QLatin1Char('-') + (song.effective_album().isEmpty() ? tr("unknown") : song.effective_album()) + QLatin1String(".jpg"); initial_file_name = initial_file_name.toLower(); - initial_file_name.replace(QRegularExpression(QStringLiteral("\\s")), QStringLiteral("-")); - initial_file_name.remove(QRegularExpression(QLatin1String(kInvalidFatCharactersRegex), QRegularExpression::CaseInsensitiveOption)); + static const QRegularExpression regex_whitespaces(QStringLiteral("\\s")); + initial_file_name.replace(regex_whitespaces, QStringLiteral("-")); + static const QRegularExpression regex_invalid_fat_characters(QLatin1String(kInvalidFatCharactersRegex), QRegularExpression::CaseInsensitiveOption); + initial_file_name.remove(regex_invalid_fat_characters); QString save_filename = QFileDialog::getSaveFileName(this, tr("Save album cover"), GetInitialPathForFileDialog(song, initial_file_name), tr(kSaveImageFileFilter) + QStringLiteral(";;") + tr(kAllFilesFilter)); diff --git a/src/device/giolister.cpp b/src/device/giolister.cpp index 1ee238a65..f1d376efe 100644 --- a/src/device/giolister.cpp +++ b/src/device/giolister.cpp @@ -225,11 +225,13 @@ QList GioLister::MakeDeviceUrls(const QString &id) { for (QString uri : std::as_const(uris)) { // gphoto2 gives invalid hostnames with []:, characters in - uri.replace(QRegularExpression(QStringLiteral("//\\[usb:(\\d+),(\\d+)\\]")), QStringLiteral("//usb-\\1-\\2")); + static const QRegularExpression regex_url_usb(QStringLiteral("//\\[usb:(\\d+),(\\d+)\\]")); + uri.replace(regex_url_usb, QStringLiteral("//usb-\\1-\\2")); QUrl url; - if (uri.contains(QRegularExpression(QStringLiteral("..+:.*")))) { + static const QRegularExpression regex_url_schema(QStringLiteral("..+:.*")); + if (uri.contains(regex_url_schema)) { url = QUrl::fromEncoded(uri.toUtf8()); } else { @@ -243,7 +245,8 @@ QList GioLister::MakeDeviceUrls(const QString &id) { url.setScheme(QStringLiteral("ipod")); } - QRegularExpression device_re(QStringLiteral("usb/(\\d+)/(\\d+)")); + static const QRegularExpression regex_usb_digit(QStringLiteral("usb/(\\d+)/(\\d+)")); + QRegularExpression device_re(regex_usb_digit); QRegularExpressionMatch re_match = device_re.match(unix_device); if (re_match.hasMatch()) { QUrlQuery url_query(url); diff --git a/src/device/mtpconnection.cpp b/src/device/mtpconnection.cpp index f8ce86d21..d1a285add 100644 --- a/src/device/mtpconnection.cpp +++ b/src/device/mtpconnection.cpp @@ -37,7 +37,7 @@ MtpConnection::MtpConnection(const QUrl &url, QObject *parent) : QObject(parent) QString hostname = url.host(); // Parse the URL - QRegularExpression host_re(QStringLiteral("^usb-(\\d+)-(\\d+)$")); + static const QRegularExpression host_re(QStringLiteral("^usb-(\\d+)-(\\d+)$")); unsigned int bus_location = 0; unsigned int device_num = 0; diff --git a/src/lyrics/azlyricscomlyricsprovider.cpp b/src/lyrics/azlyricscomlyricsprovider.cpp index 9c95ecf92..3a4a05536 100644 --- a/src/lyrics/azlyricscomlyricsprovider.cpp +++ b/src/lyrics/azlyricscomlyricsprovider.cpp @@ -46,6 +46,7 @@ QUrl AzLyricsComLyricsProvider::Url(const LyricsSearchRequest &request) { QString AzLyricsComLyricsProvider::StringFixup(const QString &text) { - return Utilities::Transliterate(text).remove(QRegularExpression(QStringLiteral("[^\\w0-9\\-]"))).toLower(); + static const QRegularExpression regex_words_numbers_and_dash(QStringLiteral("[^\\w0-9\\-]")); + return Utilities::Transliterate(text).remove(regex_words_numbers_and_dash).toLower(); } diff --git a/src/lyrics/elyricsnetlyricsprovider.cpp b/src/lyrics/elyricsnetlyricsprovider.cpp index 19fa5b8ab..80b3ecc7e 100644 --- a/src/lyrics/elyricsnetlyricsprovider.cpp +++ b/src/lyrics/elyricsnetlyricsprovider.cpp @@ -46,9 +46,12 @@ QUrl ElyricsNetLyricsProvider::Url(const LyricsSearchRequest &request) { QString ElyricsNetLyricsProvider::StringFixup(const QString &text) { + static const QRegularExpression regex_illegal_characters(QStringLiteral("[^\\w0-9_,&\\-\\(\\) ]")); + static const QRegularExpression regex_duplicate_whitespaces(QStringLiteral(" {2,}")); + return Utilities::Transliterate(text) - .replace(QRegularExpression(QStringLiteral("[^\\w0-9_,&\\-\\(\\) ]")), QStringLiteral("_")) - .replace(QRegularExpression(QStringLiteral(" {2,}")), QStringLiteral(" ")) + .replace(regex_illegal_characters, QStringLiteral("_")) + .replace(regex_duplicate_whitespaces, QStringLiteral(" ")) .simplified() .replace(QLatin1Char(' '), QLatin1Char('-')) .toLower(); diff --git a/src/lyrics/htmllyricsprovider.cpp b/src/lyrics/htmllyricsprovider.cpp index 8dda34aa7..39afbd68f 100644 --- a/src/lyrics/htmllyricsprovider.cpp +++ b/src/lyrics/htmllyricsprovider.cpp @@ -156,15 +156,21 @@ QString HtmlLyricsProvider::ParseLyricsFromHTML(const QString &content, const QR if (!lyrics.isEmpty()) { lyrics.append(QLatin1Char('\n')); } + static const QRegularExpression regex_html_tag_a(QStringLiteral("]*>[^<]*")); + static const QRegularExpression regex_html_tag_script(QStringLiteral("")); + static const QRegularExpression regex_html_tag_div(QStringLiteral("
]*>×
")); + static const QRegularExpression regex_html_tag_br(QStringLiteral("]*>")); + static const QRegularExpression regex_html_tag_p_close(QStringLiteral("

")); + static const QRegularExpression regex_html_tags(QStringLiteral("<[^>]*>")); lyrics.append(content.mid(start_lyrics_idx, end_lyrics_idx - start_lyrics_idx) .remove(QLatin1Char('\r')) .remove(QLatin1Char('\n')) - .remove(QRegularExpression(QStringLiteral("]*>[^<]*"))) - .remove(QRegularExpression(QStringLiteral(""))) - .remove(QRegularExpression(QStringLiteral("
]*>×
"))) - .replace(QRegularExpression(QStringLiteral("]*>")), QStringLiteral("\n")) - .replace(QRegularExpression(QStringLiteral("

")), QStringLiteral("\n\n")) - .remove(QRegularExpression(QStringLiteral("<[^>]*>"))) + .remove(regex_html_tag_a) + .remove(regex_html_tag_script) + .remove(regex_html_tag_div) + .replace(regex_html_tag_br, QStringLiteral("\n")) + .replace(regex_html_tag_p_close, QStringLiteral("\n\n")) + .remove(regex_html_tags) .trimmed()); } else { diff --git a/src/lyrics/letraslyricsprovider.cpp b/src/lyrics/letraslyricsprovider.cpp index 778654a4a..3eb79f423 100644 --- a/src/lyrics/letraslyricsprovider.cpp +++ b/src/lyrics/letraslyricsprovider.cpp @@ -47,9 +47,12 @@ QUrl LetrasLyricsProvider::Url(const LyricsSearchRequest &request) { QString LetrasLyricsProvider::StringFixup(const QString &text) { + static const QRegularExpression regex_illegal_characters(QStringLiteral("[^\\w0-9_,&\\-\\(\\) ]")); + static const QRegularExpression regex_multiple_whitespaces(QStringLiteral(" {2,}")); + return QString::fromLatin1(QUrl::toPercentEncoding(Utilities::Transliterate(text) - .replace(QRegularExpression(QStringLiteral("[^\\w0-9_,&\\-\\(\\) ]")), QStringLiteral("_")) - .replace(QRegularExpression(QStringLiteral(" {2,}")), QStringLiteral(" ")) + .replace(regex_illegal_characters, QStringLiteral("_")) + .replace(regex_multiple_whitespaces, QStringLiteral(" ")) .simplified() .replace(QLatin1Char(' '), QLatin1Char('-')) .toLower() diff --git a/src/lyrics/lyricfindlyricsprovider.cpp b/src/lyrics/lyricfindlyricsprovider.cpp index bc2ad2428..b5b699c77 100644 --- a/src/lyrics/lyricfindlyricsprovider.cpp +++ b/src/lyrics/lyricfindlyricsprovider.cpp @@ -62,9 +62,12 @@ QUrl LyricFindLyricsProvider::Url(const LyricsSearchRequest &request) { QString LyricFindLyricsProvider::StringFixup(const QString &text) { + static const QRegularExpression regex_illegal_characters(QStringLiteral("[^\\w0-9_\\- ]")); + static const QRegularExpression regex_multiple_whitespaces(QStringLiteral(" {2,}")); + return Utilities::Transliterate(text) - .remove(QRegularExpression(QStringLiteral("[^\\w0-9_\\- ]"))) - .replace(QRegularExpression(QStringLiteral(" {2,}")), QStringLiteral(" ")) + .remove(regex_illegal_characters) + .replace(regex_multiple_whitespaces, QStringLiteral(" ")) .simplified() .replace(QLatin1Char(' '), QLatin1Char('-')) .toLower(); diff --git a/src/lyrics/musixmatchlyricsprovider.cpp b/src/lyrics/musixmatchlyricsprovider.cpp index 78dafa228..69c153cbc 100644 --- a/src/lyrics/musixmatchlyricsprovider.cpp +++ b/src/lyrics/musixmatchlyricsprovider.cpp @@ -315,7 +315,8 @@ void MusixmatchLyricsProvider::HandleLyricsReply(QNetworkReply *reply, LyricsSea return; } - if (content_json.contains(QRegularExpression(QStringLiteral("<[^>]*>")))) { // Make sure it's not HTML code. + static const QRegularExpression regex_html_tag(QStringLiteral("<[^>]*>")); + if (content_json.contains(regex_html_tag)) { // Make sure it's not HTML code. EndSearch(search, url); return; } diff --git a/src/lyrics/songlyricscomlyricsprovider.cpp b/src/lyrics/songlyricscomlyricsprovider.cpp index 1de143d46..e6d5bb78a 100644 --- a/src/lyrics/songlyricscomlyricsprovider.cpp +++ b/src/lyrics/songlyricscomlyricsprovider.cpp @@ -45,13 +45,17 @@ QUrl SongLyricsComLyricsProvider::Url(const LyricsSearchRequest &request) { QString SongLyricsComLyricsProvider::StringFixup(QString text) { + static const QRegularExpression regex_illegal_characters(QStringLiteral("[^\\w0-9\\- ]")); + static const QRegularExpression regex_multiple_whitespaces(QStringLiteral(" {2,}")); + static const QRegularExpression regex_multiple_dashes(QStringLiteral("(-)\\1+")); + return text.replace(QLatin1Char('/'), QLatin1Char('-')) .replace(QLatin1Char('\''), QLatin1Char('-')) - .remove(QRegularExpression(QStringLiteral("[^\\w0-9\\- ]"))) - .replace(QRegularExpression(QStringLiteral(" {2,}")), QStringLiteral(" ")) + .remove(regex_illegal_characters) + .replace(regex_multiple_whitespaces, QStringLiteral(" ")) .simplified() .replace(QLatin1Char(' '), QLatin1Char('-')) - .replace(QRegularExpression(QStringLiteral("(-)\\1+")), QStringLiteral("-")) + .replace(regex_multiple_dashes, QStringLiteral("-")) .toLower(); } diff --git a/src/organize/organizeformat.cpp b/src/organize/organizeformat.cpp index b72fa9be8..6b955e2f9 100644 --- a/src/organize/organizeformat.cpp +++ b/src/organize/organizeformat.cpp @@ -192,7 +192,10 @@ OrganizeFormat::GetFilenameForSongResult OrganizeFormat::GetFilenameForSong(cons } filepath = parts_new.join(QLatin1Char('/')); - if (replace_spaces_) filepath.replace(QRegularExpression(QStringLiteral("\\s")), QStringLiteral("_")); + if (replace_spaces_) { + static const QRegularExpression regex_whitespaces(QStringLiteral("\\s")); + filepath.replace(regex_whitespaces, QStringLiteral("_")); + } if (!extension.isEmpty()) { filepath.append(QStringLiteral(".%1").arg(extension)); @@ -308,7 +311,8 @@ QString OrganizeFormat::TagValue(const QString &tag, const Song &song) const { else if (tag == QLatin1String("artistinitial")) { value = song.effective_albumartist().trimmed(); if (!value.isEmpty()) { - value.replace(QRegularExpression(QStringLiteral("^the\\s+"), QRegularExpression::CaseInsensitiveOption), QLatin1String("")); + static const QRegularExpression regex_the(QStringLiteral("^the\\s+"), QRegularExpression::CaseInsensitiveOption); + value = value.remove(regex_the); value = value[0].toUpper(); } } diff --git a/src/osd/osddbus.cpp b/src/osd/osddbus.cpp index 842c47684..a253e8afc 100644 --- a/src/osd/osddbus.cpp +++ b/src/osd/osddbus.cpp @@ -145,7 +145,8 @@ void OSDDBus::ShowMessageNative(const QString &summary, const QString &message, QVariantMap hints; QString summary_stripped = summary; - summary_stripped = summary_stripped.remove(QRegularExpression(QStringLiteral("[&\"<>]"))).simplified(); + static const QRegularExpression regex_illegal_characters(QStringLiteral("[&\"<>]")); + summary_stripped = summary_stripped.remove(regex_illegal_characters).simplified(); if (!image.isNull()) { if (version_ >= QVersionNumber(1, 2)) { diff --git a/src/playlistparsers/asxparser.cpp b/src/playlistparsers/asxparser.cpp index a69ab7672..2d2c5f9d6 100644 --- a/src/playlistparsers/asxparser.cpp +++ b/src/playlistparsers/asxparser.cpp @@ -48,12 +48,13 @@ SongList ASXParser::Load(QIODevice *device, const QString &playlist_path, const QByteArray data = device->readAll(); // Some playlists have unescaped & characters in URLs :( - QRegularExpression ex(QStringLiteral("(href\\s*=\\s*\")([^\"]+)\""), QRegularExpression::CaseInsensitiveOption); + static const QRegularExpression ex(QStringLiteral("(href\\s*=\\s*\")([^\"]+)\""), QRegularExpression::CaseInsensitiveOption); qint64 index = 0; for (QRegularExpressionMatch re_match = ex.match(QString::fromUtf8(data), index); re_match.hasMatch(); re_match = ex.match(QString::fromUtf8(data), index)) { index = re_match.capturedStart(); QString url = re_match.captured(2); - url.replace(QRegularExpression(QStringLiteral("&(?!amp;|quot;|apos;|lt;|gt;)")), QStringLiteral("&")); + static const QRegularExpression regex_html_enities(QStringLiteral("&(?!amp;|quot;|apos;|lt;|gt;)")); + url.replace(regex_html_enities, QStringLiteral("&")); QByteArray replacement = QStringLiteral("%1%2\"").arg(re_match.captured(1), url).toLocal8Bit(); data.replace(re_match.captured(0).toLocal8Bit(), replacement); diff --git a/src/playlistparsers/cueparser.cpp b/src/playlistparsers/cueparser.cpp index e5065ff76..1de87b261 100644 --- a/src/playlistparsers/cueparser.cpp +++ b/src/playlistparsers/cueparser.cpp @@ -309,7 +309,9 @@ QStringList CueParser::SplitCueLine(const QString &line) { } // Let's remove the empty entries while we're at it - return re_match.capturedTexts().filter(QRegularExpression(QStringLiteral(".+"))).mid(1, -1).replaceInStrings(QRegularExpression(QStringLiteral("^\"\"$")), QLatin1String("")); + static const QRegularExpression regex_entry(QStringLiteral(".+")); + static const QRegularExpression regex_exclude(QStringLiteral("^\"\"$")); + return re_match.capturedTexts().filter(regex_entry).mid(1, -1).replaceInStrings(regex_exclude, QLatin1String("")); } diff --git a/src/playlistparsers/parserbase.cpp b/src/playlistparsers/parserbase.cpp index 4c6c01afb..77203c11e 100644 --- a/src/playlistparsers/parserbase.cpp +++ b/src/playlistparsers/parserbase.cpp @@ -45,7 +45,8 @@ void ParserBase::LoadSong(const QString &filename_or_url, const qint64 beginning QString filename = filename_or_url; - if (filename_or_url.contains(QRegularExpression(QStringLiteral("^[a-z]{2,}:"), QRegularExpression::CaseInsensitiveOption))) { + static const QRegularExpression regex_url_schema(QStringLiteral("^[a-z]{2,}:"), QRegularExpression::CaseInsensitiveOption); + if (filename_or_url.contains(regex_url_schema)) { QUrl url(filename_or_url); song->set_source(Song::SourceFromURL(url)); if (song->source() == Song::Source::LocalFile) { diff --git a/src/playlistparsers/plsparser.cpp b/src/playlistparsers/plsparser.cpp index 49372a45c..f9815ee9d 100644 --- a/src/playlistparsers/plsparser.cpp +++ b/src/playlistparsers/plsparser.cpp @@ -50,7 +50,7 @@ SongList PLSParser::Load(QIODevice *device, const QString &playlist_path, const Q_UNUSED(playlist_path); QMap songs; - QRegularExpression n_re(QStringLiteral("\\d+$")); + static const QRegularExpression n_re(QStringLiteral("\\d+$")); while (!device->atEnd()) { QString line = QString::fromUtf8(device->readLine()).trimmed(); diff --git a/src/providers/musixmatchprovider.cpp b/src/providers/musixmatchprovider.cpp index 78e4a2f7e..d97b8ba6a 100644 --- a/src/providers/musixmatchprovider.cpp +++ b/src/providers/musixmatchprovider.cpp @@ -27,13 +27,17 @@ const char *MusixmatchProvider::kApiKey = "Y2FhMDRlN2Y4OWE5OTIxYmZlOGMzOWQzOGI3Z QString MusixmatchProvider::StringFixup(QString text) { + static const QRegularExpression regex_illegal_characters(QStringLiteral("[^\\w0-9\\- ]"), QRegularExpression::UseUnicodePropertiesOption); + static const QRegularExpression regex_duplicate_whitespaces(QStringLiteral(" {2,}")); + static const QRegularExpression regex_duplicate_dashes(QStringLiteral("(-)\\1+")); + return text.replace(QLatin1Char('/'), QLatin1Char('-')) .replace(QLatin1Char('\''), QLatin1Char('-')) - .remove(QRegularExpression(QStringLiteral("[^\\w0-9\\- ]"), QRegularExpression::UseUnicodePropertiesOption)) - .replace(QRegularExpression(QStringLiteral(" {2,}")), QStringLiteral(" ")) + .remove(regex_illegal_characters) + .replace(regex_duplicate_whitespaces, QStringLiteral(" ")) .simplified() .replace(QLatin1Char(' '), QLatin1Char('-')) - .replace(QRegularExpression(QStringLiteral("(-)\\1+")), QStringLiteral("-")) + .replace(regex_duplicate_dashes, QStringLiteral("-")) .toLower(); } diff --git a/src/radios/radiomodel.cpp b/src/radios/radiomodel.cpp index f08cc8e4e..9e0af7928 100644 --- a/src/radios/radiomodel.cpp +++ b/src/radios/radiomodel.cpp @@ -332,7 +332,8 @@ QString RadioModel::SortText(QString text) { else { text = text.toLower(); } - text = text.remove(QRegularExpression(QStringLiteral("[^\\w ]"), QRegularExpression::UseUnicodePropertiesOption)); + static const QRegularExpression regex_words_and_whitespaces(QStringLiteral("[^\\w ]"), QRegularExpression::UseUnicodePropertiesOption); + text = text.remove(regex_words_and_whitespaces); return text; diff --git a/src/radios/radioparadiseservice.cpp b/src/radios/radioparadiseservice.cpp index d0dcca6aa..d255a1954 100644 --- a/src/radios/radioparadiseservice.cpp +++ b/src/radios/radioparadiseservice.cpp @@ -109,7 +109,8 @@ void RadioParadiseService::GetChannelsReply(QNetworkReply *reply, const int task } QString label = obj_stream[QLatin1String("label")].toString(); QString url = obj_stream[QLatin1String("url")].toString(); - if (!url.contains(QRegularExpression(QStringLiteral("^[0-9a-zA-Z]*:\\/\\/"), QRegularExpression::CaseInsensitiveOption))) { + static const QRegularExpression regex_url_schema(QStringLiteral("^[0-9a-zA-Z]*:\\/\\/"), QRegularExpression::CaseInsensitiveOption); + if (!url.contains(regex_url_schema)) { url.prepend(QLatin1String("https://")); } RadioChannel channel; diff --git a/src/settings/backendsettingspage.cpp b/src/settings/backendsettingspage.cpp index e86a6c417..d84df2a2e 100644 --- a/src/settings/backendsettingspage.cpp +++ b/src/settings/backendsettingspage.cpp @@ -65,6 +65,10 @@ const double BackendSettingsPage::kDefaultBufferHighWatermark = 0.99; namespace { constexpr char kOutputAutomaticallySelect[] = "Automatically select"; constexpr char kOutputCustom[] = "Custom"; +static const QRegularExpression kRegex_ALSA_HW(QStringLiteral("^hw:.*")); +static const QRegularExpression kRegex_ALSA_PlugHW(QStringLiteral("^plughw:.*")); +static const QRegularExpression kRegex_ALSA_PCM_Card(QStringLiteral("^.*:.*CARD=.*")); +static const QRegularExpression kRegex_ALSA_PCM_Dev(QStringLiteral("^.*:.*DEV=.*")); } // namespace BackendSettingsPage::BackendSettingsPage(SettingsDialog *dialog, QWidget *parent) @@ -398,15 +402,15 @@ void BackendSettingsPage::Load_Device(const QString &output, const QVariant &dev ui_->radiobutton_alsa_hw->setEnabled(true); ui_->radiobutton_alsa_plughw->setEnabled(true); ui_->radiobutton_alsa_pcm->setEnabled(true); - if (device.toString().contains(QRegularExpression(QStringLiteral("^hw:.*")))) { + if (device.toString().contains(kRegex_ALSA_HW)) { ui_->radiobutton_alsa_hw->setChecked(true); SwitchALSADevices(ALSAPluginType::HW); } - else if (device.toString().contains(QRegularExpression(QStringLiteral("^plughw:.*")))) { + else if (device.toString().contains(kRegex_ALSA_PlugHW)) { ui_->radiobutton_alsa_plughw->setChecked(true); SwitchALSADevices(ALSAPluginType::PlugHW); } - else if (device.toString().contains(QRegularExpression(QStringLiteral("^.*:.*CARD=.*"))) || device.toString().contains(QRegularExpression(QStringLiteral("^.*:.*DEV=.*")))) { + else if (device.toString().contains(kRegex_ALSA_PCM_Card) || device.toString().contains(kRegex_ALSA_PCM_Dev)) { ui_->radiobutton_alsa_pcm->setChecked(true); SwitchALSADevices(ALSAPluginType::PCM); } @@ -623,15 +627,15 @@ void BackendSettingsPage::DeviceStringChanged() { #ifdef HAVE_ALSA if (engine()->ALSADeviceSupport(output.name)) { - if (ui_->lineedit_device->text().contains(QRegularExpression(QStringLiteral("^hw:.*"))) && !ui_->radiobutton_alsa_hw->isChecked()) { + if (ui_->lineedit_device->text().contains(kRegex_ALSA_HW) && !ui_->radiobutton_alsa_hw->isChecked()) { ui_->radiobutton_alsa_hw->setChecked(true); SwitchALSADevices(ALSAPluginType::HW); } - else if (ui_->lineedit_device->text().contains(QRegularExpression(QStringLiteral("^plughw:.*"))) && !ui_->radiobutton_alsa_plughw->isChecked()) { + else if (ui_->lineedit_device->text().contains(kRegex_ALSA_PlugHW) && !ui_->radiobutton_alsa_plughw->isChecked()) { ui_->radiobutton_alsa_plughw->setChecked(true); SwitchALSADevices(ALSAPluginType::PlugHW); } - else if ((ui_->lineedit_device->text().contains(QRegularExpression(QStringLiteral("^.*:.*CARD=.*"))) || ui_->lineedit_device->text().contains(QRegularExpression(QStringLiteral("^.*:.*DEV=.*")))) && !ui_->radiobutton_alsa_pcm->isChecked()) { + else if ((ui_->lineedit_device->text().contains(kRegex_ALSA_PCM_Card) || ui_->lineedit_device->text().contains(kRegex_ALSA_PCM_Dev)) && !ui_->radiobutton_alsa_pcm->isChecked()) { ui_->radiobutton_alsa_pcm->setChecked(true); SwitchALSADevices(ALSAPluginType::PCM); } @@ -712,11 +716,11 @@ void BackendSettingsPage::SwitchALSADevices(const ALSAPluginType alsa_plugin_typ for (int i = 0; i < ui_->combobox_device->count(); ++i) { QListView *view = qobject_cast(ui_->combobox_device->view()); if (!view) continue; - if ((ui_->combobox_device->itemData(i).toString().contains(QRegularExpression(QStringLiteral("^hw:.*"))) && alsa_plugin_type != ALSAPluginType::HW) + if ((ui_->combobox_device->itemData(i).toString().contains(kRegex_ALSA_HW) && alsa_plugin_type != ALSAPluginType::HW) || - (ui_->combobox_device->itemData(i).toString().contains(QRegularExpression(QStringLiteral("^plughw:.*"))) && alsa_plugin_type != ALSAPluginType::PlugHW) + (ui_->combobox_device->itemData(i).toString().contains(kRegex_ALSA_PlugHW) && alsa_plugin_type != ALSAPluginType::PlugHW) || - ((ui_->combobox_device->itemData(i).toString().contains(QRegularExpression(QStringLiteral("^.*:.*CARD=.*"))) || ui_->combobox_device->itemData(i).toString().contains(QRegularExpression(QStringLiteral("^.*:.*DEV=.*")))) && alsa_plugin_type != ALSAPluginType::PCM) + ((ui_->combobox_device->itemData(i).toString().contains(kRegex_ALSA_PCM_Card) || ui_->combobox_device->itemData(i).toString().contains(kRegex_ALSA_PCM_Dev)) && alsa_plugin_type != ALSAPluginType::PCM) ) { view->setRowHidden(i, true); } @@ -743,11 +747,11 @@ void BackendSettingsPage::radiobutton_alsa_hw_clicked(const bool checked) { QString device_new = ui_->lineedit_device->text(); - if (device_new.contains(QRegularExpression(QStringLiteral("^plughw:.*")))) { - device_new = device_new.replace(QRegularExpression(QStringLiteral("^plughw:")), QStringLiteral("hw:")); + if (device_new.contains(kRegex_ALSA_PlugHW)) { + device_new = device_new.replace(kRegex_ALSA_PlugHW, QStringLiteral("hw:")); } - if (!device_new.contains(QRegularExpression(QStringLiteral("^hw:.*")))) { + if (!device_new.contains(kRegex_ALSA_HW)) { device_new.clear(); } @@ -772,11 +776,11 @@ void BackendSettingsPage::radiobutton_alsa_plughw_clicked(const bool checked) { QString device_new = ui_->lineedit_device->text(); - if (device_new.contains(QRegularExpression(QStringLiteral("^hw:.*")))) { - device_new = device_new.replace(QRegularExpression(QStringLiteral("^hw:")), QStringLiteral("plughw:")); + if (device_new.contains(kRegex_ALSA_HW)) { + device_new = device_new.replace(kRegex_ALSA_HW, QStringLiteral("plughw:")); } - if (!device_new.contains(QRegularExpression(QStringLiteral("^plughw:.*")))) { + if (!device_new.contains(kRegex_ALSA_PlugHW)) { device_new.clear(); } @@ -801,7 +805,7 @@ void BackendSettingsPage::radiobutton_alsa_pcm_clicked(const bool checked) { QString device_new = ui_->lineedit_device->text(); - if (!device_new.contains(QRegularExpression(QStringLiteral("^.*:.*CARD=.*"))) && !device_new.contains(QRegularExpression(QStringLiteral("^.*:.*DEV=.*")))) { + if (!device_new.contains(kRegex_ALSA_PCM_Card) && !device_new.contains(kRegex_ALSA_PCM_Dev)) { device_new.clear(); } @@ -858,7 +862,7 @@ void BackendSettingsPage::FadingOptionsChanged() { EngineBase::OutputDetails output = ui_->combobox_output->itemData(ui_->combobox_output->currentIndex()).value(); if (engine()->type() == EngineBase::Type::GStreamer && - (!engine()->ALSADeviceSupport(output.name) || ui_->lineedit_device->text().isEmpty() || (!ui_->lineedit_device->text().contains(QRegularExpression(QStringLiteral("^hw:.*"))) && !ui_->lineedit_device->text().contains(QRegularExpression(QStringLiteral("^plughw:.*")))))) { + (!engine()->ALSADeviceSupport(output.name) || ui_->lineedit_device->text().isEmpty() || (!ui_->lineedit_device->text().contains(kRegex_ALSA_HW) && !ui_->lineedit_device->text().contains(kRegex_ALSA_PlugHW)))) { ui_->groupbox_fading->setEnabled(true); } else { diff --git a/src/settings/behavioursettingspage.cpp b/src/settings/behavioursettingspage.cpp index cdc104665..0f6cddc9d 100644 --- a/src/settings/behavioursettingspage.cpp +++ b/src/settings/behavioursettingspage.cpp @@ -85,7 +85,7 @@ BehaviourSettingsPage::BehaviourSettingsPage(SettingsDialog *dialog, QWidget *pa if (dir2.exists()) { codes << dir2.entryList(QStringList() << QStringLiteral("*.qm")); } - QRegularExpression lang_re(QStringLiteral("^strawberry_(.*).qm$")); + static const QRegularExpression lang_re(QStringLiteral("^strawberry_(.*).qm$")); for (const QString &filename : std::as_const(codes)) { QRegularExpressionMatch re_match = lang_re.match(filename); diff --git a/src/streaming/streamingsearchview.cpp b/src/streaming/streamingsearchview.cpp index 48a7d6d77..245905497 100644 --- a/src/streaming/streamingsearchview.cpp +++ b/src/streaming/streamingsearchview.cpp @@ -436,7 +436,8 @@ void StreamingSearchView::SwapModels() { QStringList StreamingSearchView::TokenizeQuery(const QString &query) { - QStringList tokens(query.split(QRegularExpression(QStringLiteral("\\s+")))); + static const QRegularExpression regex_whitespaces(QStringLiteral("\\s+")); + QStringList tokens = query.split(regex_whitespaces); for (QStringList::iterator it = tokens.begin(); it != tokens.end(); ++it) { (*it).remove(QLatin1Char('(')); diff --git a/src/utilities/coverutils.cpp b/src/utilities/coverutils.cpp index 2abe65c22..7057cfbd2 100644 --- a/src/utilities/coverutils.cpp +++ b/src/utilities/coverutils.cpp @@ -94,7 +94,10 @@ QString CoverUtils::CoverFilePath(const CoverOptions &options, const Song::Sourc filename = CoverFilenameFromVariable(options, artist, album); filename.remove(QRegularExpression(QLatin1String(kInvalidFatCharactersRegex), QRegularExpression::CaseInsensitiveOption)).remove(QLatin1Char('/')).remove(QLatin1Char('\\')); if (options.cover_lowercase) filename = filename.toLower(); - if (options.cover_replace_spaces) filename.replace(QRegularExpression(QStringLiteral("\\s")), QStringLiteral("-")); + if (options.cover_replace_spaces) { + static const QRegularExpression regex_whitespaces(QStringLiteral("\\s")); + filename.replace(regex_whitespaces, QStringLiteral("-")); + } if (!extension.isEmpty()) { filename.append(QLatin1Char('.')); filename.append(extension); diff --git a/src/utilities/filemanagerutils.cpp b/src/utilities/filemanagerutils.cpp index c348cd26a..13c2e42d7 100644 --- a/src/utilities/filemanagerutils.cpp +++ b/src/utilities/filemanagerutils.cpp @@ -66,7 +66,8 @@ void OpenInFileManager(const QString &path, const QUrl &url) { if (setting.contains(QLatin1String("Exec"))) { QString cmd = setting.value(QStringLiteral("Exec")).toString(); if (cmd.isEmpty()) break; - cmd = cmd.remove(QRegularExpression(QStringLiteral("[%][a-zA-Z]*( |$)"), QRegularExpression::CaseInsensitiveOption)); + static const QRegularExpression regex(QStringLiteral("[%][a-zA-Z]*( |$)"), QRegularExpression::CaseInsensitiveOption); + cmd = cmd.remove(regex); # if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) command_params = cmd.split(QLatin1Char(' '), Qt::SkipEmptyParts); # else diff --git a/src/utilities/strutils.cpp b/src/utilities/strutils.cpp index cdc04f604..f98562a31 100644 --- a/src/utilities/strutils.cpp +++ b/src/utilities/strutils.cpp @@ -112,7 +112,7 @@ QString DecodeHtmlEntities(const QString &text) { QString ReplaceMessage(const QString &message, const Song &song, const QString &newline, const bool html_escaped) { - QRegularExpression variable_replacer(QStringLiteral("[%][a-z]+[%]")); + static const QRegularExpression variable_replacer(QStringLiteral("[%][a-z]+[%]")); QString copy(message); // Replace the first line @@ -125,7 +125,8 @@ QString ReplaceMessage(const QString &message, const Song &song, const QString & pos += match.capturedLength(); } - qint64 index_of = copy.indexOf(QRegularExpression(QStringLiteral(" - (>|$)"))); + static const QRegularExpression regexp(QStringLiteral(" - (>|$)")); + qint64 index_of = copy.indexOf(regexp); if (index_of >= 0) copy = copy.remove(index_of, 3); return copy; diff --git a/src/utilities/timeutils.cpp b/src/utilities/timeutils.cpp index 981ee6ca1..3b52cc7e6 100644 --- a/src/utilities/timeutils.cpp +++ b/src/utilities/timeutils.cpp @@ -107,7 +107,7 @@ QString PrettyFutureDate(const QDate date) { QDateTime ParseRFC822DateTime(const QString &text) { - QRegularExpression regexp(QStringLiteral("(\\d{1,2}) (\\w{3,12}) (\\d+) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})")); + static const QRegularExpression regexp(QStringLiteral("(\\d{1,2}) (\\w{3,12}) (\\d+) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})")); QRegularExpressionMatch re_match = regexp.match(text); if (!re_match.hasMatch()) { return QDateTime();