我已经声明了这样一个正则表达式:"(^\\d{1,}\\,\\d{2}|^0) zł$"
不幸的是,它不匹配低于值(但应该匹配)508,00 zł
注意1:我发现,问题可能出在ł
字符上
注意2:问题是,我从API获取此String并在运行时检查它(它具有我所描述的确切值)
注意3:我还尝试在调试器评估中手动匹配我的模式(当我刚刚手动输入“508,00zł”时)并且它匹配了。不幸的是,我得到的字符串本身在运行时不匹配。可能是什么问题?
码:
val value = getFromApi() // 508,00 zł
val regex = "(^\\d{1,}\\,\\d{2}|^0) zł$".toRegex()
regex.matches(value) // returns false
最佳答案
此处的字母ł
并不是罪魁祸首,因为它有一个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 demo
另外,请注意使用原始字符串文字(用三重双引号分隔),它们允许使用单个反斜杠作为正则表达式转义字符。
注意
{1,}
与匹配1个或多个重复的+
量词相同。
关于android - Kotlin正则表达式不适用于我在运行时得到的波兰char (“ł”),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61944612/