Skip to content

Commit

Permalink
docs(selector): nest-escape
Browse files Browse the repository at this point in the history
  • Loading branch information
lisonge committed Apr 19, 2024
1 parent 3a354fd commit b73404b
Showing 1 changed file with 89 additions and 0 deletions.
89 changes: 89 additions & 0 deletions docs/selector/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ import ValueField from '/.vitepress/components/ValueField.vue';
所有的转义字符示例 `\\`, `\'`, `\"`, `` \` ``, `\n`, `\r`, `\t`, `\b`, `\xfF`, `\uffFF`\
不支持多行字符, 处于 `[0, 0x1F]` 的控制字符必须使用转义字符表示

此外使用 string 类型需要了解 [嵌套转义字符](#nest-escape) 以避免出现错误

操作符只能使用在对应的类型的值, 比如 `a>''` 类型不匹配, 将提示 `非法类型`/`非法选择器`

下面表格中 `-` 表示类型不匹配
Expand Down Expand Up @@ -256,3 +258,90 @@ Kotlin Wasm 需要你的浏览器支持 [WasmGC](https://developer.chrome.com/bl
- 低版本浏览器使用 **小范围不完整不一致** 的正则表达式

如果你的选择器没有使用正则表达式则不用关心此问题

## 嵌套转义字符 {#nest-escape}

转义字符一般用于表示不能直接显示具体特殊意义的字符

对于 GKD 的选择器而言, 转义字符使用示例如下

```txt
TextView[text="\\\n"]
```

这表达选择一个 TextView 它的 text 长度为 2, 开头是 `\` 末尾是换行

这和平常写的代码里面的 string 声明用法一模一样

但是选择器最终放在规则的字段里面, 也就是这个选择器字符串处于 JSON 的 string 内

如果你想当然地直接手动复制插入到编辑器里出现下面这种规则

```json5
{
matches: 'TextView[text="\\\n"]',
}
```

由于 JSON 也有自己的转义, 规则与 GKD 的转义基本一致, 因此你的实际选择器实际变成了

```txt
TextView[text="\
"]
```

这明显是一个非法的选择器

解决方式也很简单, 手动插入的时候将你的 `\` 变成 `\\`, 正确的规则如下

```json5
{
matches: 'TextView[text="\\\\\\n"]',
}
```

这是普通字符串的情况, 如果你使用 `~=`/`!~=`, 则还需要多转义一次, 因为正则表达式也有自己的转义字符

比如我们想匹配一个 TextView 并且 text 是任意一个数字, 我们想当然地用 `\d`, 所以你可能会写

```txt
TextView[text~="\d"]
```

但是你在网页审查工具输入并回车搜索会提示 非法选择器, 这是因为 `\d` 处于 GKD 的 string 内, 会被转义一次, 正确的用法是写 `\\d`

```txt
TextView[text~="\\d"]
```

实际上这部分等价的 Kotlin/Java 代码可以简单是

```txt
Regex("\\d").matches(text)
```

接下来把选择器放到规则里面, 根据上面的描述, 规则应该是

```json5
{
matches: 'TextView[text~="\\\\d"]',
}
```

如果想用正则匹配一个 `\` 字符, 最终规则应该写成

```json5
{
matches: 'TextView[text~="\\\\\\\\"]',
}
```

实现和上面相同的结果, 即用 `=` 匹配一个 `\` 字符, 最终规则应该写成

```json5
{
matches: 'TextView[text="\\\\"]',
}
```

类似的问题 [gkd-kit/gkd#603](https://github.com/gkd-kit/gkd/issues/603)

0 comments on commit b73404b

Please sign in to comment.