regex.match如果要花费10秒钟以上的时间才能取消操作?
我正在使用巨大的正则表达式来匹配特定的文本,有时可能有用,有时可能会失败...
正则表达式: MINISTÉRIO(?:[^P]*(?:P(?!ÁG\s:\s\d+\/\d+)[^P]*)(?:[\s\S]*?))PÁG\s:\s+\d+\/(\d+)\b(?:\D*(?:(?!\1\/\1)\d\D*)*)\1\/\1(?:[^Z]*(?:Z(?!6:\s\d+)[^Z]*)(?:[\s\S]*?))Z6:\s+\d+
工作示例:https://regex101.com/r/kU6rS5/1
所以..如果要花费10秒以上,我想取消操作。可能吗?我找不到与沙发有关的任何东西
谢谢。
您可以生成一个执行正则表达式匹配的子进程,如果它在 10 秒内未完成,则将其终止。可能有点矫枉过正,但它应该可以工作。
如果你走这条路,叉子可能是你应该使用的。
如果您能原谅我的非纯函数,这段代码将演示如何在分叉子进程和主进程之间来回通信的要点:
const { fork } = require('child_process');
const processPath = __dirname + '/regex-process.js';
const regexProcess = fork(processPath);
let received = null;
regexProcess.on('message', function(data) {
console.log('received message from child:', data);
clearTimeout(timeout);
received = data;
regexProcess.kill(); // or however you want to end it. just as an example.
// you have access to the regex data here.
// send to a callback, or resolve a promise with the value,
// so the original calling code can access it as well.
});
const timeoutInMs = 10000;
let timeout = setTimeout(() => {
if (!received) {
console.error('regexProcess is still running!');
regexProcess.kill(); // or however you want to shut it down.
}
}, timeoutInMs);
regexProcess.send('message to match against');
Run Code Online (Sandbox Code Playgroud)
function respond(data) {
process.send(data);
}
function handleMessage(data) {
console.log('handing message:', data);
// run your regex calculations in here
// then respond with the data when it's done.
// the following is just to emulate
// a synchronous computational delay
for (let i = 0; i < 500000000; i++) {
// spin!
}
respond('return regex process data in here');
}
process.on('message', handleMessage);
Run Code Online (Sandbox Code Playgroud)
不过,这可能最终掩盖了真正的问题。您可能需要考虑像其他海报建议的那样重新编写正则表达式。
| 归档时间: |
|
| 查看次数: |
1128 次 |
| 最近记录: |