Forgot password?
 Create new account
View 118|Reply 2

Regex 疑問

[Copy link]

3147

Threads

8493

Posts

610K

Credits

Credits
66163
QQ

Show all posts

hbghlyj Posted at 2024-2-24 05:49:52 |Read mode
MathJax的FindTeX.ts第158行:
  1.     return new RegExp((endp || quotePattern(end)) + '|\\\\(?:[a-zA-Z]|.)|[{}]', 'g');
Copy the Code

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

3147

Threads

8493

Posts

610K

Credits

Credits
66163
QQ

Show all posts

 Author| hbghlyj Posted at 2024-2-24 05:51:43
FindEnd用的這個Regex,在有MathJax的頁面打開調試器輪入下面可以顯示:
Screenshot 2024-02-23 215012.png
  1. MathJax.startup.input[0].findTeX.end.$[2]
  2. /\$|\\(?:[a-zA-Z]|.)|[{}]/g
Copy the Code

701

Threads

110K

Posts

910K

Credits

Credits
94177
QQ

Show all posts

kuing Posted at 2024-2-24 14:57:05
Last edited by kuing at 2024-2-24 16:15:00我觉得你说得对,是等效的。
但为何这样写建议去问作者😄

(纯瞎猜……:
说不定这样写会匹配得更快?因为他预估那一块绝大多数情况下都是英文字母?
==========
用以下两段代码来检测时间:
  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");
Copy the Code
  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(".");
Copy the Code

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

手机版Mobile version|Leisure Math Forum

2025-4-20 22:23 GMT+8

Powered by Discuz!

× Quick Reply To Top Return to the list