PAYATHON 2026

Scala Regex 为什么匹配不到 Java case 标签?

数据小陈

原因

问题出在 Regex.matches 的匹配范围:它要求正则表达式匹配整行。原表达式 """case [^:]+""" 从 case 开始,只匹配到冒号前。示例行还包含冒号和后面的 return 表达式,因此无法匹配整行。行首有缩进时,匹配也会失败。

你给出的行形如:

case SRC_UNKNOWN: return new PortInfo(nGetPortName(getID(), portIndex), true);

原正则最多只匹配 case SRC_UNKNOWN,与整行内容不一致。

用正则定位标签

如果只需判断一行是否包含这种标签,可以使用 findFirstMatchIn。下面的表达式允许行首有空白,并将冒号前的标签捕获为第 1 组:

val casePattern: Regex = """^\s*case\s+([^:]+)\s*:""".r

for line <- lines do
  casePattern.findFirstMatchIn(line).foreach { matched =>
    val label = matched.group(1).trim
    println(s"$label: $line")
  }

^ 限定从当前行开头检查;\s* 允许缩进;case\s+ 匹配关键字及其后的空白;([^:]+) 捕获冒号前的标签;最后的 \s*: 匹配标签后的可选空白和冒号。findFirstMatchIn 只需在行中找到符合表达式的部分,不要求匹配整行。

如果只想输出原始行,可以这样写:

if casePattern.findFirstIn(line).nonEmpty then println(line)

继续使用 matches 的写法

也可以让表达式覆盖整行剩余内容,例如:

val casePattern: Regex = """\s*case\s+[^:]+:.*""".r

if casePattern.matches(line) then println(line)

这种写法适用于这里展示的单行 case ...: 格式。若要提取标签,使用前面的捕获组更方便。

注意

这些正则只处理以 case 标签开头、并以冒号结束的单行格式。若 Java 文件还包含 case ... -> 形式,或需要准确区分注释、字符串和完整 Java 语法,简单的逐行正则无法解析所有情况。需要为这些格式扩展规则,或使用 Java 解析器。

备注:内容仅供参考。