正则expression式匹配缓慢
我试图让使用ajax上传文件2MB与nodejs应用程序,
客户端我使用FileReader
API来保存base64,然后通过FormData
。
我的问题是服务器端代码像下面这么慢,我把console.log
试图find哪个部分,当上传更大的文件,似乎卡在正则expression式match
..
任何build议如何改善?
https://regex101.com/r/qS2lB2/1
... console.log(image.data_base64); // 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvd ... var matches = image.data_base64.match(/^data:.+\/(.+);base64,(.*)$/); console.log('done'); // slow var fileExtension = matches[1]; var base64 = matches[2]; var buffer = new Buffer(base64, 'base64'); ... yield Promise.resolve( filesystem().writeFile(temporaryFilePath, buffer) );
如果你仍然想使用正则expression式,性能可以通过用非适当的否定字符类replace非尾随的.+
子模式来改善,这种types涉及的回溯less得多。
使用
/^data:[^\/]+\/([^;]+);base64,(.*)$/
请参阅正则expression式演示 。
说明:
-
^
– string的开始 -
data:
– 文字字符序列data:
-
[^\/]+
– 1+除/
-
\/
– 文字斜杠 -
([^;]+)
– 第1组:1+以外的字符;
-
;base64,
– 文字字符序列;base,
-
(.*)
– 组2:0+任何字符,但换行符 -
$
– string的结尾。
额外的长度意味着正则expression式必须经过的string更多。
在以data:image/jpeg;base64,/9
开头的string上testing你的正则expression式(使用regex101.com,PHP模式) data:image/jpeg;base64,/9
:
添加了字符| 脚步
0 | 63 1 | 68 2 | 73 10 | 113 100 | 563
每个额外的字符是5个步骤。
如何修复正则expression式
(基于characters added=100
以563步)
-
你最大的问题是
.+
s- 用。+replace第一个。 把它降到248步
- 用
.+?
replace第二个 从248步到34步
性能问题的原因
灾难性的回溯。 .+
会吃掉整个string,如果还需要find更多的字符,就必须返回,逐个释放字符。 .+?
是懒惰的,这意味着它将尝试在正则expression式中尽可能快的消耗尽可能less的字符。
以multipart/form-data
请求发送base64编码的文件是不必要的。 FileReader
有一个.readAsArrayBuffer()
方法,它将为您提供可以直接传递给formData.append()
的原始数据(作为ArrayBuffer formData.append()
。