diff --git a/README.md b/README.md index 9300c8b0..ac5cc7fe 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Android手机监听短信并根据指定规则转发到其他手机:钉钉机 - [x] 支持双卡手机,增加卡槽标识/运营商/手机号(如果能获取的话) - [x] 支持多重匹配规则 - [x] 支持标注卡槽号码(优先使用)、设备信息;自定义转发信息模版 -- [ ] 支持正则匹配规则 +- [x] 支持正则匹配规则 - [x] 支持卡槽匹配规则 - [ ] 转发规则、发送方配置导出与导入 diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java b/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java index 1f3ca652..e2e6de83 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java @@ -8,6 +8,8 @@ import com.idormy.sms.forwarder.utils.RuleLineUtils; import java.util.HashMap; import java.util.Map; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; public class RuleModel { public static final String FILED_TRANSPOND_ALL = "transpond_all"; @@ -20,6 +22,7 @@ public class RuleModel { public static final String CHECK_START_WITH = "startwith"; public static final String CHECK_END_WITH = "endwith"; public static final String CHECK_NOT_IS = "notis"; + public static final String CHECK_REGEX = "regex"; public static final Map CHECK_MAP = new HashMap(); public static final String CHECK_SIM_SLOT_ALL = "ALL"; public static final String CHECK_SIM_SLOT_1 = "SIM1"; @@ -87,6 +90,8 @@ public class RuleModel { return CHECK_START_WITH; case R.id.btnEndWith: return CHECK_END_WITH; + case R.id.btnRegex: + return CHECK_REGEX; case R.id.btnNotIs: return CHECK_NOT_IS; default: @@ -161,6 +166,20 @@ public class RuleModel { checked = msgValue.endsWith(this.value); } break; + case CHECK_REGEX: + if (msgValue != null) { + try { + checked = Pattern.matches(this.value, msgValue); + } catch (PatternSyntaxException e) { + checked = false; + Log.d(TAG, "PatternSyntaxException: "); + Log.d(TAG, "Description: " + e.getDescription()); + Log.d(TAG, "Index: " + e.getIndex()); + Log.d(TAG, "Message: " + e.getMessage()); + Log.d(TAG, "Pattern: " + e.getPattern()); + } + } + break; default: break; } @@ -207,6 +226,8 @@ public class RuleModel { return R.id.btnStartWith; case CHECK_END_WITH: return R.id.btnEndWith; + case CHECK_REGEX: + return R.id.btnRegex; case CHECK_NOT_IS: return R.id.btnNotIs; default: diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLine.java b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLine.java index 15c1d07c..a4642d76 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLine.java +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLine.java @@ -7,6 +7,8 @@ import com.idormy.sms.forwarder.model.vo.SmsVo; import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; class RuleLine { public static final String CONJUNCTION_AND = "并且"; @@ -19,6 +21,7 @@ class RuleLine { public static final String CHECK_CONTAIN = "包含"; public static final String CHECK_START_WITH = "开头"; public static final String CHECK_END_WITH = "结尾"; + public static final String CHECK_REGEX = "正则"; public static List CONJUNCTION_LIST = new ArrayList(); public static List FILED_LIST = new ArrayList(); public static List SURE_LIST = new ArrayList(); @@ -315,6 +318,20 @@ class RuleLine { checked = msgValue.endsWith(this.value); } break; + case CHECK_REGEX: + if (msgValue != null) { + try { + checked = Pattern.matches(this.value, msgValue); + } catch (PatternSyntaxException e) { + checked = false; + logg("PatternSyntaxException: "); + logg("Description: " + e.getDescription()); + logg("Index: " + e.getIndex()); + logg("Message: " + e.getMessage()); + logg("Pattern: " + e.getPattern()); + } + } + break; default: break; } diff --git a/app/src/main/res/layout/alert_dialog_setview_rule.xml b/app/src/main/res/layout/alert_dialog_setview_rule.xml index f7b55772..b1dde0f2 100644 --- a/app/src/main/res/layout/alert_dialog_setview_rule.xml +++ b/app/src/main/res/layout/alert_dialog_setview_rule.xml @@ -164,6 +164,13 @@ android:text="结尾" android:textSize="13sp" /> + +