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 解析器。
备注:内容仅供参考。
