正则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()