首页 > 解决方案 > Kotlin 正则表达式不适用于我在运行时获得的波兰字符(“ł”)

问题描述

我已经声明了这样的正则表达式: "(^\\d{1,}\\,\\d{2}|^0) zł$"

不幸的是,它不匹配低于值(但它应该)

508,00 zł

注意1:我发现问题可能出在ł角色上

注意 2:问题是,我从 API 获取此字符串并在运行时检查它(它具有我描述的确切值)

注意3:我还尝试在调试器评估中手动匹配我的模式(当我手动输入“508, 00zł”时)并且它匹配。不幸的是,我得到的字符串本身在运行时不匹配。可能的问题是什么?

代码:

val value = getFromApi() // 508,00 zł
val regex = "(^\\d{1,}\\,\\d{2}|^0) zł$".toRegex()
regex.matches(value) // returns false

标签: androidregexkotlin

解决方案


这封信ł在这里不是罪魁祸首,因为它有一个 Unicode 表示。

最常见的问题是空白:它可以是任何 Unicode 空白,从外观上看,您永远无法分辨。

要匹配任何 ASCII 空格,您可以使用\s. 在这里,您有这种空白,因此我在问题下方的顶级评论对您有用。

要匹配任何 Unicode 空白字符,您可以使用\p{Z}匹配任何一个空白字符,或\p{Z}*匹配其出现的 0 个或多个:

val value = "508,00 zł"
val regex = """^(\d+,\d{2}|0)\p{Z}zł$""".toRegex()
// val regex = """^(\d+,\d{2}|0)\p{Z}*zł$""".toRegex()
println(regex.matches(value)) // => True

查看Kotlin 演示

另外,请注意使用原始字符串文字(用三个双引号分隔),它们允许使用单个反斜杠作为正则表达式转义字符。

注意与匹配 1 个或多个重复的量词{1,}相同。+


推荐阅读