测试的脚本如下
function findMessage(){
var collection=id("com.tencent.tim:id/chat_item_content_layout").find();
collection.forEach(function(o){
log(o.text());
});
log(id("com.tencent.tim:id/chat_item_content_layout").textMatches(reg).exists());
str="COM28 28";
log(reg.test(str));
}
//var reg=new RegExp("(COM28|COM62|COM41)");
var reg=/(COM28|COM62|COM41)/;
findMessage();

这是输出
[Extension Host] 00:42:25.753/V: 开始运行[<remote>:d:\脚本练习\相关测试.js]
[Extension Host] 00:42:25.794/D: 等我开始
[Extension Host] 00:42:25.795/D: 开始
[Extension Host] 00:42:25.796/D: COM28 28
[Extension Host] 00:42:25.797/D: COM29 29
[Extension Host] 00:42:25.797/D: COM30 30
[Extension Host] 00:42:25.798/D: 好了
[Extension Host] 00:42:25.827/D: false
[Extension Host] 00:42:25.828/D: true
[Extension Host] 00:42:25.829/V:
[<remote>:d:\脚本练习\相关测试.js]运行结束,用时0.075000秒

脚本的目的是想找qq群的聊天内容中包含COM28或者COM26或者COM41这几个关键字的,至于为什么不用textContains是因为其实我要做的是匹配包含上述几个关键字并且其后紧跟空格符的文本.只是现在我没这样匹配而已.
这个重点是:控件找到了,聊天记录书出来了,证明确实有包含COM28的文本,但是匹配不到.最让我想不通的是,我直接把聊天记录中的文本复制粘贴出来赋值给str,然后用原生js的test方法却显示能匹配.也就是说这个正则表达式是没问题的,但是为什么在控件里却不能匹配呢?

我看了下说明文档,textMatches方法是能支持js的正则表达式的啊,而且我用java的字符串式的正则也不能匹配.QAQ求大佬能出来帮我看下.跪谢.

textMatches("COM28|COM62|COM41");

啊啊啊啊 为什么不对啊.求解释啊.真心跪求,想了一天了,改了几种方式都是在textMatches里没法匹配,直接把内容赋值给str,再用使用js的test却能匹配.到底是为什么啊,明明是同一个正则表达式,textMatches不能匹配test却能啊.啊啊啊啊啊

开发者

请注意有没有使用最新版本的Auto.js(目前为3.0 Beta3)

是最新版 v3.00 Beta3.在textMatches里这样写:"COM28|COM62|COM41"或者/COM28|COM62|COM41/这样也不行,把它赋值给reg再使用也不行,不报错,就是匹配不出,去在线测试工具测试却可以匹配。大大能帮我看看这是为什么么?我以前写的一个脚本也用了js的正则却能用.

@admin function findMessage(){
var collection=id("com.tencent.tim:id/chat_item_content_layout").find();
collection.forEach(function(o){
log(o.text()); //分别输出:等我开始;开始;COM28 28;COM29 29;COM30 30;好了
});
log(id("com.tencent.tim:id/chat_item_content_layout").textMatches(reg).exists()); //这儿永远为false
str="COM28 28";
log(reg.test(str)); //这儿都是true
}
var reg=new RegExp("(COM28|COM62|COM41)\b"); //第一种
//var reg=/(COM28|COM62|COM41)\b/; //第二种
//var reg="(COM28|COM62|COM41)\b" //第三种
findMessage();

@jump 还是false;test方法是true;但是你这意思跟我的有出入.我是必须要在COM后接28或62或41,你这样写的话只是去匹配了COM了,直接str=COM也能匹配.

开发者

@高发烧正则表达式求助 中说:

reg

test和matches是两个不同的概念,test是如果正则在目标字符串存在就返回true,但是matches是整个目标字符串要完全匹配整个正则。

function matches(str, reg){
  var r = str.match(reg);
   return r != null && r.index == 0 && r[0].length == str.length;
}

哦哦 懂了懂了 谢谢大大

所以我的reg要设定每个QQ的完整模式而不是一部分对吧 哈哈 谢谢谢

此回复已被删除!

var reg = ********************;

最后由 jump 编辑

@jump 嗯嗯 我已经弄好了 谢谢

  • 18
    帖子
  • 550
    浏览

与 Auto.js 的连接断开,我们正在尝试重连,请耐心等待