表达式:
一、width="69">.*二、69">.*三、width="69">想要抓到我么?呵呵,努力吧
想要抓到我么?呵呵,努力吧 |
感谢1楼,可是加"()"括号的作用是什么? 分组?我用的C#
最佳答案
- 五星知识达人网友:三千妖杀
- 2021-03-10 16:44
这个问题不一定的,因为有时候不同的语言对正则的匹配有不同的优化,比如c#中对^和$肯定有优化,加上他们反倒可以加快查询速度,总的来说正则的效率取决于减少回溯,说白了就是减少正则程序经过不必要的分支。而且有时候为了精确匹配多写些也是必要的。我写一个看看:^.*?width="69">(想要抓到我么?呵呵,努力吧) |
这个方程有几种在c#中的优化:1. ^的使用,因为正则无非是字符匹配,无论查找什么都要从字符串开头开始,一旦写了^那么匹配就不会从第一个字符以后字符开始匹配的工作了,这样减少了多余的回溯。2.“.*?”的使用,就像一楼所说像“.*”这样的匹配是饿汉模式,他会匹配所有的字符不过有些编译器会拒绝匹配回车等字符,他在匹配多字符尽头时才会发现后边的正则逻辑不对反过来不断的吐出字符供给其他的匹配逻辑这样会走很多的弯路,用“.*?”这样的懒汉模式就会先匹配后边的正则逻辑减少不必要的回溯。3. c#中寻找确定字符要比模糊字符要快,也就是说要匹配单词字符用“\w”要比[0-9a-zZA-Z]要快,这是编译器优化的工具不然就不会费劲的把这些可以自己写的东西搬上来了,同理的对于具体的字符会比模糊的字符匹配效率高,所以没有用“.*”。c#的正则优化是一门学问至少有几十种的方法,而且还在更新,如果感兴趣可以上网收收,外国有许多这样的网站的。
对了还有一点补充:千万不要随便使用记忆分组也就是“()”。因为严格的讲记忆分组不属于正则数学表达的范畴只是他的实用性所以很多语言都采用他,由于记忆分组会把其中的匹配放到内存中这样会消耗系统资源严重影响效率,要想提高效率要尽量避免记忆分组的使用,对于不需要记忆的单元组可以使用(?:)代替绕开内存记忆。
正则表达式什么时候还按照字节来匹配了?正则表达式不分perl、java、js还是python,它是一个独立的系统。
正则本身就决定了它一定是用来匹配字符的。只要给定字符串,就可以来匹配字符串。
谁知道呢,听说越复杂的越快呢.应该被限制的就多,如你用abc去匹配abc,正则比较的时候就会看a是不是匹配a,b是不是匹配b...这样,每个字母只要比较一次,如果你用\w+去匹配,他就会看a是不是字母,b是不是字母,这可能还更麻烦呢.
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息