正则匹配转义字符相关问题
LingEmberMaple opened this issue · comments
一些验证
- 搜索检查是否已经存在请求相同功能的问题/讨论,以避免重复创建问题
- GKD 默认不包含任何规则, 如果您想要自定义规则, 您可以 查看文档
- 1.我确认知晓并同意维护者直接关闭不符合 issue 规范的问题
- 2.我确认知晓并同意维护者直接关闭不符合 issue 规范的问题
- 3.我确认知晓并同意维护者直接关闭不符合 issue 规范的问题
- 我已确保提供下列的日志和BUG描述及其复现步骤, 否则我同意维护者直接关闭问题
日志文件-无论什么问题不包含日志将会被直接关闭
BUG描述(文字/截图/视频)
使用 matches
\notMatches
操作符 且 值 包含转义符时,保存规则将忽略转义符
示例规则
{
id: 'com.miui.securitycenter',
name: '小米手机管家',
groups: [
{
name: '功能类-高敏感权限自动确定',
key: 1,
desc: '勾选[我已知晓可能存在的风险]-10s后点击[确定]',
enable: false,
quickFind: true,
activityIds: [
'com.miui.permcenter.privacymanager.SpecialPermissionInterceptActivity'
],
rules: [
{
key: 0,
matches: [
'@[checked=false] + [id="com.miui.securitycenter:id/intercept_warn_content_end"]'
],
snapshotUrls: [
'https://i.gkd.li/i/14965657'
],
exampleUrls: [
'https://m.gkd.li/57941037/e9672ccd-8dd1-4060-bdbe-52bb355d404f'
]
},
{
key: 1,
preKeys: [
0
],
matches: [
'[text!~=".*\(\d*\)"][id="com.miui.securitycenter:id/intercept_warn_allow"]'
],
snapshotUrls: [
'https://i.gkd.li/i/14965656'
],
exampleUrls: [
'https://m.gkd.li/57941037/1f2a118a-db2a-448d-a95d-f10d746b72e3'
]
}
]
}
]
}
保存后规则如下
展开
{
name: '功能类-高敏感权限自动确定',
key: 0,
desc: '勾选[我已知晓可能存在的风险]-10s后点击[确定]',
enable: false,
quickFind: true,
activityIds: [
'com.miui.permcenter.privacymanager.SpecialPermissionInterceptActivity'
],
rules: [
{
key: 0,
matches: [
'@[checked=false] + [id="com.miui.securitycenter:id/intercept_warn_content_end"]'
],
snapshotUrls: [
'https://i.gkd.li/i/14965657'
],
exampleUrls: [
'https://m.gkd.li/57941037/e9672ccd-8dd1-4060-bdbe-52bb355d404f'
]
},
{
key: 1,
preKeys: [
0
],
matches: [
'[text!~=".*(d*)"][id="com.miui.securitycenter:id/intercept_warn_allow"]'
],
snapshotUrls: [
'https://i.gkd.li/i/14965656'
],
exampleUrls: [
'https://m.gkd.li/57941037/1f2a118a-db2a-448d-a95d-f10d746b72e3'
]
}
]
}
第33行由
'[text!~=".*\(\d*\)"][id="com.miui.securitycenter:id/intercept_warn_allow"]'
保存为
'[text!~=".*(d*)"][id="com.miui.securitycenter:id/intercept_warn_allow"]'
转义符被忽略
期望行为(文字/截图/视频)
规则第33行保存为'[text!~=".*\(\d*\)"][id="com.miui.securitycenter:id/intercept_warn_allow"]'
且正常触发
实际行为(文字/截图/视频)
规则第33行保存为'[text!~=".*(d*)"][id="com.miui.securitycenter:id/intercept_warn_allow"]'
'[text!~=".*\\\\(\\\\d*\\\\)"][id="com.miui.securitycenter:id/intercept_warn_allow"]'
首先你写的规则文件里的转译字符先被 json5 转义一次,然后被 gkd 的 string 类型转义一次,最后传递给 kotlin 的 Regex
所以你要写两次转义,换句话说,如果你想要正则匹配一个原始的 \
字符
对与 kotlin 来说,要写成 Regex("\\\\").matches(text)
所以对与 gkd 来说,要写成 [text~="\\\\\"]
对与 JavaScript/JSON/JSON5 来说,要写成 [text~="\\\\\\\\"]
matches : '[text~="\\\\\\\\"]'
如果你的规则文件是由 https://github.com/gkd-kit/subscription-template 构建
你可以使用 JavaScript 的原始字符串语法去除一次转义,这样只需要写一次转义
matches : String.raw`[text~="\\\\"]`
首先你写的规则文件里的转译字符先被 json5 转义一次,然后被 gkd 的 string 类型转义一次,最后传递给 kotlin 的 Regex
所以你要写两次转义,换句话说,如果你想要正则匹配一个原始的
\
字符对与 kotlin 来说,要写成
Regex("\\\\").matches(text)
所以对与 gkd 来说,要写成
[text~="\\\\\"]
对与 JavaScript/JSON/JSON5 来说,要写成
[text~="\\\\\\\\"]
matches : '[text~="\\\\\\\\"]'
如果你的规则文件是由 https://github.com/gkd-kit/subscription-template 构建
你可以使用 JavaScript 的原始字符串语法去除一次转义,这样只需要写一次转义
matches : String.raw`[text~="\\\\"]`
解决了,感谢!