英文:
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("Region\\ name=Provence\\ Alpes\\ Cote\\ d'Azur shops=350,City=Nice"
,"Region\\ name=Provence\\ Alpes\\ Cote\\ d'Azur,City=Nice shopsabcdabcdabcdasssss=350"
,"City=Nice,Region\\ name=Provence\\ Alpes\\ Cote\\ d'Azur shopsabcdabcdabcdasssss=350"
,"City=Nice,Region\\ name =unknown shops=350")
//通过这样,让我们提取所有目标为键的值。
val target = """Region\\ name"""
val pattern =raw"$target\s*=((?:[\w'\\ -]+)+)(?:[ ,]+\w+=|,|$$)".r.unanchored
val output = data.collect{ case pattern(m) => m }
但是在处理像shopsabcdabcdabcdasssss
或shopsabcdabcdabcdasssssssssssssssssssssss
这样的长字符串时,使用.r.unanchored
需要更多的时间或者会卡住。
是否可以用更好的代码来替代它?
问题已解决,感谢提供答案。
regex101.com/r/nSYxfj/6 -----------> 这会适用于提取整数值吗?还是我需要修改些什么?
英文:
These are the lines of text I have:
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
Below solution provides the result:
val data =List("Region\\ name=Provence\\ Alpes\\ Cote\\ d'Azur shops=350,City=Nice"
,"Region\\ name=Provence\\ Alpes\\ Cote\\ d'Azur,City=Nice shopsabcdabcdabcdasssss=350"
,"City=Nice,Region\\ name=Provence\\ Alpes\\ Cote\\ d'Azur shopsabcdabcdabcdasssss=350"
,"City=Nice,Region\\ name =unknown shops=350")
//With that, let's extract all the values where target is the key.
val target = """Region\\ name"""
val pattern =raw"$target\s*=((?:[\w'\\ -]+)+)(?:[ ,]+\w+=|,|$$)".r.unanchored
val output = data.collect{ case pattern(m) => 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'\\ -]+)+)
模式部分会导致灾难性回溯。
你需要使用
Region\\ name\\s*=([\\w'\\\\\\s-]+)(?:[\\s,]+\\w+=|,|$)
查看正则表达式演示。
在Scala中,可以这样定义模式:
val pattern =raw\"$target\\\\s*=([\\w'\\\\\\s-]+)(?:[\\s,]+\\w+=|,|$$)\".r.unanchored
英文:
The ((?:[\w'\\ -]+)+)
pattern part causes catastrophic backtracking.
You need to use
Region\\ name\s*=([\w'\\\s-]+)(?:[\s,]+\w+=|,|$)
See the regex demo.
In Scala, define the pattern like this:
val pattern =raw"$target\s*=([\w'\\\s-]+)(?:[\s,]+\w+=|,|$$)".r.unanchored
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论