0. 新增专门用于切分各种规则的类,分解完所有规则后才切片,其余操作都只改变变量指向规则字符串中的位置。暂时只用于处理三大规则的“&&”、“||”,“%%”、“@”切分,以后将扩展到全部解析规则。

改进jsonPath,jsoup,xpath中的规则切分方法,允许查询规则的正则或字符串中存在“&&”,“||”,“%%”,“@”而不切错。

/**
* 改进解析方法
* 解决阅读”&&“、”||“与jsonPath支持的”&&“、”||“之间的冲突
* 解决{$.rule}形式规则可能匹配错误的问题,旧规则用正则解析内容含‘}’的json文本时,用规则中的字段去匹配这种内容时,会匹配错误.现改用平衡嵌套方法解决这个问题
* */

1. 加强AnalyzeByJSoup中的索引写法

/**
* 1.支持阅读原有写法,':'分隔索引,!或.表示筛选方式,索引可为负数
*
* 例如 tag.div.-1:10:2 或 tag.div!0:3
*
* 2. 支持与jsonPath类似的[]索引写法
*
* 格式形如 [it,it,。。。] 或 [!it,it,。。。] 其中[!开头表示筛选方式为排除,it为单个索引或区间。
*
* 区间格式为 start:end 或 start🔚step,其中start为0可省略,end为-1可省略。
*
* 索引,区间两端及间隔都支持负数
*
* 例如 tag.div[-1, 3:-2:-10, 2]
*
* 特殊用法 tag.div[-1:0] 可在任意地方让列表反向
*
* */

 -------------------
 已测试过各种“&&”、“||”,“%%”切分的规则及两者索引写法,没发现大问题,坤飞大大可以再测试看看
pull/1114/head
bushixuanqi 3 years ago
parent 4341f3b6f8
commit 61d5e11688
  1. 16
      app/src/main/java/io/legado/app/model/analyzeRule/RuleAnalyzer.kt

@ -83,7 +83,7 @@ class RuleAnalyzer(data: String) {
/**
* 从剩余字串中拉出一个字符串直到但不包括匹配序列或剩余字串用完
* @param seq 分隔字符 **区分大小写**
* @param seq 分隔字符 **区分大小写**
* @return 是否找到相应字段
*/
fun consumeTo(seq: String,setStartPos:Boolean = true): Boolean {
@ -130,14 +130,18 @@ class RuleAnalyzer(data: String) {
*/
private fun findToAny(vararg seq:Char): Int {
for (s in seq){
val start = pos //声明新变量记录临时起始位置,不更改类本身的起始位置
val offset = queue.indexOf(s, pos)
while (!isEmpty) {
for (s in seq) if(queue[pos] == s) return pos //匹配则返回位置
if (offset != -1) return offset //只要匹配到,就返回相应位置
pos++ //逐个试探
}
pos = start //匹配失败,位置回退
return -1
}
@ -265,7 +269,7 @@ class RuleAnalyzer(data: String) {
return splitRule(arrayOf()) //仅一个分隔字串时,直接二段解析更快
}else if (!consumeToAny(* split)) return arrayOf(queue) //未找到分隔符
val st = findToAny( '(','[' ) //查找筛选器
val st = findToAny( '[','(' ) //查找筛选器
if(st == -1) {
@ -324,7 +328,7 @@ class RuleAnalyzer(data: String) {
if (!consumeTo(elementsType,false)) return rules + queue.substring(start) //此处consumeTo(...)开始位置不是规则的开始位置,start沿用上次设置
val st = findToAny( '(','[' ) //查找筛选器
val st = findToAny( '[','(' ) //查找筛选器
if(st == -1) {
var rule = rules + queue.substring(start, pos) //压入本次分隔的首段规则到数组

Loading…
Cancel
Save