相关疑难解决方法(0)

我可以进一步提高这个正则表达式的性能吗?

我试图从线程转储文件中获取线程名称.线程名称通常包含在每个线程转储的第一行的"双引号"中.它可能看起来很简单如下:

"THREAD1" daemon prio=10 tid=0x00007ff6a8007000 nid=0xd4b6 runnable [0x00007ff7f8aa0000]
Run Code Online (Sandbox Code Playgroud)

或者大到如下:

"[STANDBY] ExecuteThread: '43' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007ff71803a000 nid=0xd3e7 in Object.wait() [0x00007ff7f8ae1000]
Run Code Online (Sandbox Code Playgroud)

我写的正则表达式很简单:"(.*)".它将双引号内的所有内容作为一组捕获.但是它会导致沉重的回溯,因此需要很多步骤,可以看出这里.在口头上,我们可以将此正则表达式解释为"捕获任何包含在双引号内的任何内容"

所以我提出了另一个正则表达式,它执行相同的操作:"([^\"])".在口头上,我们可以将此正则表达式描述为"捕获双引号内包含的任意数量的非双引号字符".我没有发现任何快速正则表达式.它不执行任何回溯,因此它需要最少的步骤,可以看出这里.

我把这个告诉了我的同事.他想出了另一个:"(.*?)".我没弄明白它是如何工作的.它执行相当大的比第一个少回溯但比第二个可以看出慢一点这里.然而

  • 我不明白为什么回溯会提前停止.
  • 我理解的?是量词,意思是once or not at all.但是我不明白如何once or not at all在这里使用.
  • 事实上,我无法猜测我们如何口头描述这个正则表达式.

我的同事试图解释我,但我仍然无法完全理解它.谁能解释一下?

java regex performance

4
推荐指数
1
解决办法
507
查看次数

展开循环,何时使用

我试图了解正则表达式中的展开循环。之间的最大区别是:

MINISTÉRIO[\s\S]*?PÁG
Run Code Online (Sandbox Code Playgroud)

MINISTÉRIO(?:[^P]*(?:P(?!ÁG\s:\s\d+\/\d+)[^P]*)(?:[\s\S]*?))PÁG
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

http://regexr.com/3dmlr

我为什么应该使用第二个,如果第一个做相同的事情?

谢谢。

javascript regex

2
推荐指数
1
解决办法
312
查看次数

标签 统计

regex ×2

java ×1

javascript ×1

performance ×1