You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin中编写可正常工作的多行正则表达式?

多行带注释正则失效问题解决

你遇到的核心问题是Kotlin三重引号字符串的转义规则和RegexOption.COMMENTS的特性没匹配好,导致正则逻辑被破坏。下面是具体问题点和修正方案:

问题根源

  1. 三重引号的转义冗余:单行字符串里的\\是为了表示一个\,但三重引号字符串会保留原始字符,不需要额外转义,你写的\\./会被解析成\./,和原始正则的./匹配逻辑不符。
  2. 未转义的空格被忽略:RegexOption.COMMENTS会自动忽略所有未转义的空白字符(包括换行、空格),你字符集里的普通空格会被当作注释前的分隔符忽略,导致原本允许空格的规则失效。
  3. $符号的错误转义:三重引号里$不需要转义成\$,直接写$就表示正则的行结束符,转义后反而变成匹配字面量$。

修正后的多行带注释正则

val regexPattern = """
    ^                        # 匹配字符串起始位置
    (?!\./)                 # 负向预查:排除以"./"开头的情况
    (?!.*/$)              # 负向预查:排除以"/"结尾的情况
    (?!.*\.\./)            # 负向预查:排除包含"../"的内容
    [0-9A-Za-z!\-_*'().\ /]+ # 允许的字符集合(转义空格确保被匹配)
    $                       # 匹配字符串结束位置
""".trimIndent()

val regex = regexPattern.toRegex(RegexOption.COMMENTS)

关键修正点

  • 把所有\\替换成\:比如(?!\\./)改成(?!\./),让正则逻辑和原始单行版本一致。
  • 字符集中的空格前加\:.\ /确保这个空格会被正则当作需要匹配的字符,而不是被COMMENTS选项忽略。
  • 去掉$前的转义:直接写$表示行结束,避免匹配字面量$。
  • 移除MULTILINE选项:原始正则是匹配整个字符串的起止,MULTILINE会让^/$匹配每行的起止,不符合你的验证需求。

这个修正后的版本和你原始的单行正则逻辑完全一致,同时保留了注释的可读性。

内容的提问来源于stack exchange,提问作者Jhoan Manuel Muñoz Serrano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:35:16