Kotlin正则表达式无法匹配VERSION_ID值及多行匹配方案求助
问题原因
- 缺失双引号匹配规则:你的目标文本中
VERSION_ID=之后紧跟双引号",你写的正则直接接数字匹配规则,自然无法命中。 - 注意Kotlin字符串转义规则:如果用普通双引号包裹正则字符串,
\d的反斜杠需要额外转义为\\d,否则会触发Kotlin非法转义字符报错;如果用Kotlin原生字符串(三个双引号"""包裹)则不需要转义反斜杠。
修正方案
通用写法(适配单/多行场景)
你需要匹配的是固定前缀的单行内容,默认的正则搜索逻辑已经可以在多行文本中命中目标,修正后的正则代码如下:
// 使用原生字符串避免转义,补充双引号匹配规则 private val myRegex = Regex("""VERSION_ID="(\d+\.\d+)"""")
如果需要单独提取大版本和小版本,可以拆分分组:
private val myRegex = Regex("""VERSION_ID="(\d+)\.(\d+)"""")
如果需要严格匹配行首的VERSION_ID字段,避免其他位置出现相同字符串导致误匹配,可以开启多行模式:
// (?m) 是内置多行模式标记,让^匹配每一行的行首 private val myRegex = Regex("""(?m)^VERSION_ID="(\d+\.\d+)"""")
提取结果示例
val inputText = """ NAME="SLED" VERSION="12-SP2" VERSION_ID="12.2" PRETTY_NAME="SUSE Linux Enterprise Desktop 12 SP2" ID="sled" ID_LIKE="suse" ANSI_COLOR="0;32" CPE_NAME="cpe:/o:suse:sled:12:sp2" """.trimIndent() myRegex.find(inputText)?.let { matchResult -> // 取分组1得到完整的版本号 12.2 val versionId = matchResult.groupValues[1] println(versionId) // 如果用拆分分组的写法,可以分别取大小版本 // val majorVersion = matchResult.groupValues[1] // 12 // val minorVersion = matchResult.groupValues[2] // 2 }
内容的提问来源于stack exchange,提问作者cynicalswan77
相关产品推荐
相关产品推荐

