From 785703a6c67a336cfce58db31bd578e886a115b4 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 7 Apr 2025 17:11:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/analyzeRule/AnalyzeRule.kt | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 420dade60..11e953981 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -64,6 +64,7 @@ class AnalyzeRule( private var analyzeByJSonPath: AnalyzeByJSonPath? = null private val stringRuleCache = hashMapOf>() + private val regexCache = hashMapOf() private var coroutineContext: CoroutineContext = EmptyCoroutineContext @@ -413,29 +414,48 @@ class AnalyzeRule( */ private fun replaceRegex(result: String, rule: SourceRule): String { if (rule.replaceRegex.isEmpty()) return result - var vResult = result - vResult = if (rule.replaceFirst) { + val replaceRegex = rule.replaceRegex + val replacement = rule.replacement + val regex = compileRegexCache(replaceRegex) + if (rule.replaceFirst) { /* ##match##replace### 获取第一个匹配到的结果并进行替换 */ - kotlin.runCatching { - val pattern = Pattern.compile(rule.replaceRegex) - val matcher = pattern.matcher(vResult) - if (matcher.find()) { - matcher.group(0)!!.replaceFirst(rule.replaceRegex.toRegex(), rule.replacement) + if (regex != null) kotlin.runCatching { + val pattern = regex.toPattern() + val matcher = pattern.matcher(result) + return if (matcher.find()) { + matcher.group(0)!!.replaceFirst(regex, replacement) } else { "" } - }.getOrElse { - rule.replacement } + return replacement } else { /* ##match##replace 替换*/ - kotlin.runCatching { - vResult.replace(rule.replaceRegex.toRegex(), rule.replacement) - }.getOrElse { - vResult.replace(rule.replaceRegex, rule.replacement) + if (regex != null) kotlin.runCatching { + return result.replace(regex, replacement) + } + return result.replace(replaceRegex, replacement) + } + } + + private fun compileRegexCache(regex: String): Regex? { + if (regexCache.size > 16) { + return try { + regex.toRegex() + } catch (e: Exception) { + null + } + } + if (regexCache.containsKey(regex)) { + return regexCache[regex] + } + return regexCache.getOrPut(regex) { + try { + regex.toRegex() + } catch (e: Exception) { + null } } - return vResult } /**