我在使用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代码中使用这些修饰符。
非常感谢任何帮助
答案 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)
- and
或or
字母序列\b
- 结束词边界。如果两端都需要空格,请使用
val pattern = """ (and|or) """.r
val replacedStr = pattern replaceAllIn (str, m => if (m.group(1) == "or") " || " else " && ")
答案 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)