From 8cc4c767353cc896af15219b3ef0c452b4533677 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Wed, 22 May 2024 21:52:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E8=BD=AC=E5=8F=91?= =?UTF-8?q?=E8=A7=84=E5=88=99`=E5=8C=B9=E9=85=8D=E7=9A=84=E5=80=BC`?= =?UTF-8?q?=E5=85=81=E8=AE=B8=E4=BC=A0=E5=85=A5`=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E7=AC=A6`=EF=BC=9A`=E4=B8=8E(&&)`=E3=80=81`?= =?UTF-8?q?=E6=88=96(||)`=EF=BC=88=E7=94=A8=E4=BA=8E=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E5=85=B3=E9=94=AE=E8=AF=8D=EF=BC=89=20#470?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/forwarder/database/entity/Rule.kt | 72 ++++++++++--------- .../idormy/sms/forwarder/utils/RuleLine.kt | 67 ++++++++--------- 2 files changed, 71 insertions(+), 68 deletions(-) diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/entity/Rule.kt b/app/src/main/java/com/idormy/sms/forwarder/database/entity/Rule.kt index 9a966f75..bfa2dae6 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/entity/Rule.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/entity/Rule.kt @@ -214,47 +214,49 @@ data class Rule( //内容分支 private fun checkValue(msgValue: String?): Boolean { - var checked = false - when (this.check) { - CHECK_IS -> checked = this.value == msgValue - CHECK_NOT_IS -> checked = this.value != msgValue - CHECK_CONTAIN -> if (msgValue != null) { - checked = msgValue.contains(this.value) - } + if (msgValue == null) return false - CHECK_NOT_CONTAIN -> if (msgValue != null) { - checked = !msgValue.contains(this.value) - } - - CHECK_START_WITH -> if (msgValue != null) { - checked = msgValue.startsWith(this.value) - } - - CHECK_END_WITH -> if (msgValue != null) { - checked = msgValue.endsWith(this.value) - } - - CHECK_REGEX -> if (msgValue != null) { - try { - //checked = Pattern.matches(this.value, msgValue); - val pattern = Pattern.compile(this.value, Pattern.CASE_INSENSITIVE) + fun evaluateCondition(condition: String): Boolean { + return when (check) { + CHECK_IS -> msgValue == condition + CHECK_NOT_IS -> msgValue != condition + CHECK_CONTAIN -> msgValue.contains(condition) + CHECK_NOT_CONTAIN -> !msgValue.contains(condition) + CHECK_START_WITH -> msgValue.startsWith(condition) + CHECK_END_WITH -> msgValue.endsWith(condition) + CHECK_REGEX -> try { + val pattern = Pattern.compile(condition, Pattern.CASE_INSENSITIVE) val matcher = pattern.matcher(msgValue) - while (matcher.find()) { - checked = true - break - } + matcher.find() } catch (e: PatternSyntaxException) { - Log.d(TAG, "PatternSyntaxException: ") - Log.d(TAG, "Description: " + e.description) - Log.d(TAG, "Index: " + e.index) - Log.d(TAG, "Message: " + e.message) - Log.d(TAG, "Pattern: " + e.pattern) + Log.i(TAG, "PatternSyntaxException: ${e.description}, Index: ${e.index}, Message: ${e.message}, Pattern: ${e.pattern}") + false + } + + else -> false + } + } + + fun parseAndEvaluate(expression: String): Boolean { + // Split by "||" and evaluate each segment joined by "&&" + val orGroups = expression.split("||") + return orGroups.any { orGroup -> + val andGroups = orGroup.split("&&") + andGroups.all { andGroup -> + val trimmedCondition = andGroup.trim() + evaluateCondition(trimmedCondition) } } - - else -> {} } - Log.i(TAG, "checkValue " + msgValue + " " + this.check + " " + this.value + " checked:" + checked) + + val checked = if (value.contains("&&") || value.contains("||")) { + parseAndEvaluate(value) + } else { + evaluateCondition(value) + } + + Log.i(TAG, "checkValue $msgValue $check $value checked:$checked") return checked } + } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLine.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLine.kt index 023e57d6..8a9ad920 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLine.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLine.kt @@ -119,45 +119,46 @@ class RuleLine(line: String, lineNum: Int, beforeRuleLine: RuleLine?) { //内容分支 private fun checkValue(msgValue: String?): Boolean { - var checked = false - when (check) { - CHECK_EQUALS -> checked = value == msgValue - CHECK_CONTAIN -> if (msgValue != null) { - checked = msgValue.contains(value) - } + if (msgValue == null) return false - CHECK_NOT_CONTAIN -> if (msgValue != null) { - checked = !msgValue.contains(value) - } - - CHECK_START_WITH -> if (msgValue != null) { - checked = msgValue.startsWith(value) - } - - CHECK_END_WITH -> if (msgValue != null) { - checked = msgValue.endsWith(value) - } - - CHECK_REGEX -> if (msgValue != null) { - try { - //checked = Pattern.matches(this.value, msgValue); - val pattern = Pattern.compile(value, Pattern.CASE_INSENSITIVE) + fun evaluateCondition(condition: String): Boolean { + return when (check) { + CHECK_EQUALS -> msgValue == condition + CHECK_CONTAIN -> msgValue.contains(condition) + CHECK_NOT_CONTAIN -> !msgValue.contains(condition) + CHECK_START_WITH -> msgValue.startsWith(condition) + CHECK_END_WITH -> msgValue.endsWith(condition) + CHECK_REGEX -> try { + val pattern = Pattern.compile(condition, Pattern.CASE_INSENSITIVE) val matcher = pattern.matcher(msgValue) - while (matcher.find()) { - checked = true - break - } + matcher.find() } catch (e: PatternSyntaxException) { - logg("PatternSyntaxException: ") - logg("Description: " + e.description) - logg("Index: " + e.index) - logg("Message: " + e.message) - logg("Pattern: " + e.pattern) + logg("PatternSyntaxException: ${e.description}, Index: ${e.index}, Message: ${e.message}, Pattern: ${e.pattern}") + false + } + + else -> false + } + } + + fun parseAndEvaluate(expression: String): Boolean { + // Split by "||" and evaluate each segment joined by "&&" + val orGroups = expression.split("||") + return orGroups.any { orGroup -> + val andGroups = orGroup.split("&&") + andGroups.all { andGroup -> + val trimmedCondition = andGroup.trim() + evaluateCondition(trimmedCondition) } } - - else -> {} } + + val checked = if (value.contains("&&") || value.contains("||")) { + parseAndEvaluate(value) + } else { + evaluateCondition(value) + } + logg("checkValue $msgValue $check $value checked:$checked") return checked }