如何在Kotlin中编写可正常工作的多行正则表达式?
多行带注释正则失效问题解决
你遇到的核心问题是Kotlin三重引号字符串的转义规则和RegexOption.COMMENTS的特性没匹配好,导致正则逻辑被破坏。下面是具体问题点和修正方案:
问题根源
- 三重引号的转义冗余:单行字符串里的
\\是为了表示一个\,但三重引号字符串会保留原始字符,不需要额外转义,你写的\\./会被解析成\./,和原始正则的./匹配逻辑不符。 - 未转义的空格被忽略:
RegexOption.COMMENTS会自动忽略所有未转义的空白字符(包括换行、空格),你字符集里的普通空格会被当作注释前的分隔符忽略,导致原本允许空格的规则失效。 - $符号的错误转义:三重引号里
$不需要转义成\$,直接写$就表示正则的行结束符,转义后反而变成匹配字面量$。
修正后的多行带注释正则
val regexPattern = """ ^ # 匹配字符串起始位置 (?!\./) # 负向预查:排除以"./"开头的情况 (?!.*/$) # 负向预查:排除以"/"结尾的情况 (?!.*\.\./) # 负向预查:排除包含"../"的内容 [0-9A-Za-z!\-_*'().\ /]+ # 允许的字符集合(转义空格确保被匹配) $ # 匹配字符串结束位置 """.trimIndent() val regex = regexPattern.toRegex(RegexOption.COMMENTS)
关键修正点
- 把所有
\\替换成\:比如(?!\\./)改成(?!\./),让正则逻辑和原始单行版本一致。 - 字符集中的空格前加
\:.\ /确保这个空格会被正则当作需要匹配的字符,而不是被COMMENTS选项忽略。 - 去掉
$前的转义:直接写$表示行结束,避免匹配字面量$。 - 移除
MULTILINE选项:原始正则是匹配整个字符串的起止,MULTILINE会让^/$匹配每行的起止,不符合你的验证需求。
这个修正后的版本和你原始的单行正则逻辑完全一致,同时保留了注释的可读性。
内容的提问来源于stack exchange,提问作者Jhoan Manuel Muñoz Serrano
相关产品推荐
相关产品推荐

