正则表达匹配慢

时间:2016-04-03 17:18:18

标签: javascript regex node.js filesystems

我尝试使用nodejs app,使用超过2mb的ajax上传文件 客户端我使用public function rules() { return [ ['CodeKargah', 'CodeKargah_check'], // ... // ... // ... ]; } public function CodeKargah_check($attribute) { $zero = substr($this - > $attribute, 0, 1); $len = strlen((string)($this - > $attribute)); if ($zero == '0' && $len == 10) { return null; } else { $this - > addError($attribute, Yii::t('app', 'First number must be zero')); } } api来保存base64,然后通过FileReader

我的问题是下面的服务器端代码这么慢,我把FormData试图找到哪个部分,当上传更大尺寸的文件时,似乎卡在正则表达式console.log ..
任何建议如何改善这个?

https://regex101.com/r/qS2lB2/1

match

3 个答案:

答案 0 :(得分:2)

如果您仍然因某些原因仍想使用正则表达式,可以通过将非尾随/^data:[^\/]+\/([^;]+);base64,(.*)$/ 子模式替换为涉及更少回溯的适当否定字符类来提高性能。

使用

^

请参阅regex demo

说明:

  • data: - 字符串开头
  • data: - 文字字符序列[^\/]+
  • / - \/
  • 以外的1个字符
  • ([^;]+) - 字面斜杠
  • ; - 第1组:除;base64,
  • 以外的1 +个字符
  • ;base, - 文字字符序列(.*)
  • $ - 第2组:0 +任何字符,但换行符
  • @media only screen and (max-width: 700px){ html.mn-open{ background: none; } .mn-navigation-wrap{ width: 50%; } } - 字符串结束。

答案 1 :(得分:1)

额外长度意味着正则表达式必须通过更多字符串。

在以data:image/jpeg;base64,/9开头的字符串上测试您的正则表达式(使用regex101.com,PHP模式):

添加了字符|步骤

0   | 63
1   | 68
2   | 73
10  | 113
100 | 563

每个附加角色都是5个步骤。

如何修复正则表达式

(基于characters added=100采取563步骤)

  • 您最大的问题是.+ s

    • 用。+替换第一个。把它降低到248步
    • .+?替换秒,将其从248改为34步

性能问题的原因

灾难性的回溯。 .+将耗尽整个字符串,如果仍需要查找更多字符,则必须返回,逐个释放字符。 .+?是懒惰的,这意味着它将尝试在正则表达式中尽快继续前进,尽可能少地使用字符。

答案 2 :(得分:0)

try{ String value1 = txt_depID.getText(); String value2 = txt_depName.getText(); String sql = "Update tblDepartment set depID = '"+value1+"' , depName = '"+value2+"' where depID = '"+value1+"'"; String sql1 = "Select depID, depName from tblDepartment"; Class.forName(driver); conn = DriverManager.getConnection(url); ps = conn.prepareStatement(sql1); rs = ps.executeQuery(); ps = conn.prepareStatement(sql); ps.execute(); if(rs.next()){ String depi = rs.getString("depID"); //Issue: only reading first row if(depi.equals(value1)){ JOptionPane.showMessageDialog(null, "Entry Saved"); } else{ JOptionPane.showMessageDialog(null, "Department doesn't exist"); } } } catch (Exception e){ JOptionPane.showMessageDialog(null, e); } 请求中发送base64编码的文件是不必要的。 multipart/form-data有一个FileReader方法,可以为您提供原始数据(作为ArrayBuffer),您可以将其直接传递给.readAsArrayBuffer()