正则表达式程序在搜索带有空格和反斜杠的字符串时性能问题。

huangapple go评论65阅读模式
英文:

Regex program to search a string with spaces and back slashes performance issue

问题

以下是翻译好的部分:

这些是我拥有的文本行:

Region\ name=Provence\ Alpes\ Cote\ d'Azur shops=350,City=Nice 12345
Region\ name=Provence\ Alpes\ Cote\ d'Azur,City=Nice shopsabcdabcdabcdasssss=350 13456
City=Nice,Region\ name=Provence\ Alpes\ Cote\ d'Azur shopsabcdabcdabcdasssss=350 23456

Input: Region\ name<br/>
Output: Provence\ Alpes\ Cote\ d'Azur

Input: City<br/>
Output: Nice

以下解决方案提供了结果:

val data =List(&quot;Region\\ name=Provence\\ Alpes\\ Cote\\ d&#39;Azur shops=350,City=Nice&quot;
                ,&quot;Region\\ name=Provence\\ Alpes\\ Cote\\ d&#39;Azur,City=Nice shopsabcdabcdabcdasssss=350&quot;
                ,&quot;City=Nice,Region\\ name=Provence\\ Alpes\\ Cote\\ d&#39;Azur shopsabcdabcdabcdasssss=350&quot;
                ,&quot;City=Nice,Region\\ name =unknown shops=350&quot;)
               //通过这样,让我们提取所有目标为键的值。
val target  = &quot;&quot;&quot;Region\\ name&quot;&quot;&quot;
val pattern =raw&quot;$target\s*=((?:[\w&#39;\\ -]+)+)(?:[ ,]+\w+=|,|$$)&quot;.r.unanchored
val output  = data.collect{ case pattern(m) =&gt; m }

但是在处理像shopsabcdabcdabcdasssssshopsabcdabcdabcdasssssssssssssssssssssss这样的长字符串时,使用.r.unanchored需要更多的时间或者会卡住。

是否可以用更好的代码来替代它?
问题已解决,感谢提供答案。

regex101.com/r/nSYxfj/6 -----------> 这会适用于提取整数值吗?还是我需要修改些什么?

英文:

These are the lines of text I have:

Region\ name=Provence\ Alpes\ Cote\ d&#39;Azur shops=350,City=Nice 12345
Region\ name=Provence\ Alpes\ Cote\ d&#39;Azur,City=Nice shopsabcdabcdabcdasssss=350 13456
City=Nice,Region\ name=Provence\ Alpes\ Cote\ d&#39;Azur shopsabcdabcdabcdasssss=350 23456

Input: Region\ name<br/>
Output: Provence\ Alpes\ Cote\ d'Azur

Input: City<br/>
Output: Nice

Below solution provides the result:

val data =List(&quot;Region\\ name=Provence\\ Alpes\\ Cote\\ d&#39;Azur shops=350,City=Nice&quot;
                ,&quot;Region\\ name=Provence\\ Alpes\\ Cote\\ d&#39;Azur,City=Nice shopsabcdabcdabcdasssss=350&quot;
                ,&quot;City=Nice,Region\\ name=Provence\\ Alpes\\ Cote\\ d&#39;Azur shopsabcdabcdabcdasssss=350&quot;
                ,&quot;City=Nice,Region\\ name =unknown shops=350&quot;)
               //With that, let&#39;s extract all the values where target is the key.
val target  = &quot;&quot;&quot;Region\\ name&quot;&quot;&quot;
val pattern =raw&quot;$target\s*=((?:[\w&#39;\\ -]+)+)(?:[ ,]+\w+=|,|$$)&quot;.r.unanchored
val output  = data.collect{ case pattern(m) =&gt; m }

But it is taking more time or hangs to extract the result by using .r.unanchored when there is a long string like shopsabcdabcdabcdasssss or shopsabcdabcdabcdasssssssssssssssssssssss.

Can it be replaced with better code?
It hs been resolved and thanks for contributing answer

regex101.com/r/nSYxfj/6 ----------->will it work for extracting integer value.Or I have to modify something

答案1

得分: 4

The ((?:[\w&#39;\\ -]+)+) 模式部分会导致灾难性回溯

你需要使用

Region\\ name\\s*=([\\w&#39;\\\\\\s-]+)(?:[\\s,]+\\w+=|,|$)

查看正则表达式演示

在Scala中,可以这样定义模式:

val pattern =raw\"$target\\\\s*=([\\w&#39;\\\\\\s-]+)(?:[\\s,]+\\w+=|,|$$)\".r.unanchored
英文:

The ((?:[\w&#39;\\ -]+)+) pattern part causes catastrophic backtracking.

You need to use

Region\\ name\s*=([\w&#39;\\\s-]+)(?:[\s,]+\w+=|,|$)

See the regex demo.

In Scala, define the pattern like this:

val pattern =raw&quot;$target\s*=([\w&#39;\\\s-]+)(?:[\s,]+\w+=|,|$$)&quot;.r.unanchored

huangapple
  • 本文由 发表于 2020年7月25日 02:38:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/63079643.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定