找回密码
 快速注册
搜索
查看: 30|回复: 2

Regex 疑問

[复制链接]

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-2-24 05:49 |阅读模式
MathJax的FindTeX.ts第158行:
  1.     return new RegExp((endp || quotePattern(end)) + '|\\\\(?:[a-zA-Z]|.)|[{}]', 'g');
复制代码

不懂的是:(?:[a-zA-Z]|.)等效於(?:.)吧?
既然[a-zA-Z]包含於.,它們的並集是後者,為什麼要這樣寫?

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-24 05:51
FindEnd用的這個Regex,在有MathJax的頁面打開調試器輪入下面可以顯示:
Screenshot 2024-02-23 215012.png
  1. MathJax.startup.input[0].findTeX.end.$[2]
  2. /\$|\\(?:[a-zA-Z]|.)|[{}]/g
复制代码

730

主题

1万

回帖

9万

积分

积分
93623
QQ

显示全部楼层

kuing 发表于 2024-2-24 14:57
本帖最后由 kuing 于 2024-2-24 16:15 编辑 我觉得你说得对,是等效的。
但为何这样写建议去问作者😄

(纯瞎猜……:
说不定这样写会匹配得更快?因为他预估那一块绝大多数情况下都是英文字母?
==========
用以下两段代码来检测时间:
  1. const str = "aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddddddddddddddddddd";
  2. const reg1 = /(?:[a-zA-Z]|.)/g;
  3. console.time("a-z");
  4. for(let i=0;i<10000;i++){
  5.         str.match(reg1)
  6. }
  7. console.timeEnd("a-z");
复制代码
  1. const str = "aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddddddddddddddddddd";
  2. const reg2 = /(?:.)/g;
  3. console.time(".");
  4. for(let i=0;i<10000;i++){
  5.         str.match(reg2)
  6. }
  7. console.timeEnd(".");
复制代码

经多次运行(包括谁先谁后,都试过),发现并无明显差别,看来猜测并不对。

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 16:04

Powered by Discuz!

× 快速回复 返回顶部 返回列表