From c85333d5ba5b31d0cffa6d40da8052f69606d409 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 11 Apr 2022 18:07:14 +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 --- .../io/legado/app/help/ContentProcessor.kt | 12 ++++------ .../io/legado/app/utils/RegexExtensions.kt | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/io/legado/app/utils/RegexExtensions.kt diff --git a/app/src/main/java/io/legado/app/help/ContentProcessor.kt b/app/src/main/java/io/legado/app/help/ContentProcessor.kt index 3985099c0..8c6b04af8 100644 --- a/app/src/main/java/io/legado/app/help/ContentProcessor.kt +++ b/app/src/main/java/io/legado/app/help/ContentProcessor.kt @@ -8,8 +8,8 @@ import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.ReplaceRule import io.legado.app.help.config.AppConfig import io.legado.app.help.config.ReadBookConfig +import io.legado.app.utils.regexReplace import io.legado.app.utils.toastOnUi -import kotlinx.coroutines.withTimeout import splitties.init.appCtx import java.lang.ref.WeakReference import java.util.concurrent.CopyOnWriteArrayList @@ -134,12 +134,10 @@ class ContentProcessor private constructor( getContentReplaceRules().forEach { item -> if (item.pattern.isNotEmpty()) { kotlin.runCatching { - withTimeout(1000) { - mContent = if (item.isRegex) { - mContent.replace(item.pattern.toRegex(), item.replacement) - } else { - mContent.replace(item.pattern, item.replacement) - } + mContent = if (item.isRegex) { + mContent.regexReplace(item.pattern, item.replacement, 1000L) + } else { + mContent.replace(item.pattern, item.replacement) } }.onFailure { AppLog.put("${item.name}替换出错\n${it.localizedMessage}") diff --git a/app/src/main/java/io/legado/app/utils/RegexExtensions.kt b/app/src/main/java/io/legado/app/utils/RegexExtensions.kt new file mode 100644 index 000000000..4988d8d78 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/RegexExtensions.kt @@ -0,0 +1,24 @@ +package io.legado.app.utils + +import io.legado.app.exception.NoStackTraceException +import java.util.regex.Pattern + +fun CharSequence.regexReplace(regex: String, replacement: String, timeout: Long): String { + val timeEnd = System.currentTimeMillis() + timeout + val pattern = Pattern.compile(regex) + val matcher = pattern.matcher(this) + var result: Boolean = matcher.find() + if (result) { + val sb = StringBuffer() + do { + //matcher.appendReplacement(sb, replacement) + if (System.currentTimeMillis() > timeEnd) { + throw NoStackTraceException("替换超时") + } + result = matcher.find() + } while (result) + matcher.appendTail(sb) + return sb.toString() + } + return this.toString() +}