regex - 模式匹配 Scala 正则表达式评估
问题描述
想象一下,你有一个包含 & 符号的字符串,我的目标是在 & 和任何字符之间添加空格(如果没有的话)
前任
Case 1: Body&Soul should be-->Body & Soul (working)
Case 2: Body &Soul--> Body & Soul (working)
Case 3: Body& Soul -->Body & Soul (working)
Case 4: Body&Soul&Mind -->Body & Soul & Mind (working)
Case 5: Body &Soul& Mind ---> Body & Soul & Mind (not working)
Case 6: Body& Soul &Mind ---> Body & Soul & Mind (not working)
def replaceEmployerNameContainingAmpersand(emplName: String): String
= {
val r = "(?<! )&(?! )".r.unanchored
val r2 = "&(?! )".r.unanchored
val r3 = "(?<! )&".r.unanchored
emplName match {
case r() => emplName.replaceAll("(?<! )&(?! )", " & ")
case r2() => emplName.replaceAll("&(?! )", "& ")
case r3() => emplName.replaceAll("(?<! )&", " &")
}
}
目标是修复案例 5 和 6:Body &Soul& Mind
或Body& Soul &Mind
-->Body & Soul & Mind
但它不起作用,因为当情况 2 或 3 发生时,情况正在退出并且与第二个&
符号不匹配。
谁能帮助我如何匹配案例 5 和 6?
解决方案
您可以在 a 的两端捕获一个可选的空白字符&
并检查它们是否匹配,并相应地使用替换replaceAllIn
:
def replaceAllIn(target: CharSequence, replacer: (Match) => String): String
使用替换函数替换所有匹配项。
请参阅Scala 演示:
val s = "Body&Soul, Body &Soul, Body& Soul, Body&Soul&Mind, Body &Soul& Mind, Body& Soul &Mind"
val pattern = """(\s)?&(\s)?""".r
val res = pattern.replaceAllIn(s, m => (if (m.group(1) != null) m.group(1) else " ") + "&" + (if (m.group(2) != null) m.group(2) else " ") )
println(res)
// => Body & Soul, Body & Soul, Body & Soul, Body & Soul & Mind, Body & Soul & Mind, Body & Soul & Mind
该(\s)?&(\s)?
模式将单个空白字符匹配并捕获到第 1 组中,然后匹配&
,然后在第 2 组中捕获可选的空白。
如果 Group 1 不为 null,则有一个空格,我们保留它,否则,用空格替换。相同的逻辑用于尾随空格。
推荐阅读
- c++ - CLion MakeFile 构建失败
- docker-for-windows - 在 Docker-compose 中使用现有的文件共享/卷和 Docker for Windows WSL2
- r - 更改 .Rprofile 中的图形显示选项
- vb.net - 双列表成员之间的减法
- paypal - 贝宝订阅 API 集成。我什么时候需要创建产品?
- c++ - 接受任何大小的 char 的 std::array 作为非类型模板参数
- python-3.x - 获取顶点和连接到它的顶点的详细信息
- list - 创建我自己的模块和类型没有按预期工作
- python - python字典异步安全吗?
- devops - Microsoft Azure Devops 2019 停止保留构建后不移除构建锁