Scala正则表达式找到并替换

时间:2015-11-09 09:33:19

标签: regex scala

我在使用scala中的正则表达式查找和替换部分字符串时遇到问题。

给出以下字符串:q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q[10]>20 我想用“&&”替换所有出现的“和”和“或”和“||”。

我提出的正则表达式是:.+\s((and|or)+)\s.+。但是,这似乎只能找到最后的“和”。

当使用https://regex101.com/#pcre时,我试图通过添加修饰符gU来解决这个问题,这似乎有效。但我不确定如何在Scala代码中使用这些修饰符。

非常感谢任何帮助

3 个答案:

答案 0 :(得分:3)

为什么不使用如下解决方案:

str.replaceAll("\\sand\\s", " && ").replaceAll("\\sor\\s", " || ")

答案 1 :(得分:3)

您可以使用lambda检查捕获/匹配的子字符串,并使用if/else语法替换为相应的替换:

val str = "q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q[10]>20"
val pattern = """\b(and|or)\b""".r
val replacedStr = pattern replaceAllIn (str, m => if (m.group(1) == "or") "||" else "&&")
println(replacedStr)

code demo的结果:q[k6.q3]>=0 && q[dist.report][0] || q[dist.report][1] && q[10]>20

正则表达式细分:

  • \b - 字边界
  • (and|or) - andor字母序列
  • \b - 结束词边界。

如果两端都需要空格,请使用

val pattern = """ (and|or) """.r
val replacedStr = pattern replaceAllIn (str, m => if (m.group(1) == "or") " || " else " && ")

请参阅another Scala demo

答案 2 :(得分:0)

你需要添加“?”在正确的地方让你的模式不情愿:

val line = "q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q[10]>20"

val regex = ".+\\s((and|or)+)\\s.+".r

regex.findAllIn(line).toList
//Produces list with one item:
//res0: List[String] = List(q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q)

与:

相比
val line = "q[k6.q3]>=0 and q[dist.report][0] or q[dist.report][1] and q[10]>20"

val regex = ".+?\\s((and|or)+)\\s.+?".r

regex.findAllIn(line).toList

//List with 3 items:
//res0: List[String] = List(q[k6.q3]>=0 and q, [dist.report][0] or q, [dist.report][1] and q)