【发布时间】:2016-10-04 22:26:07
【问题描述】:
我有两个正则表达式提取器。
一个用于 .java 文件,另一个用于 .scala 文件
val JavaFileRegEx =
"""\S*
\s+
//
\s{1}
([^\.java]+)
\.java
""".replaceAll("(\\s)", "").r
val ScalaFileRegEx =
"""\S*
\s+
//
\s{1}
([^\.scala]+)
\.scala
""".replaceAll("(\\s)", "").r
我想使用上面的这些提取器从下面的示例代码中提取一个 java 文件名和一个 scala 文件名。
val string1 = " // Tester.java"
val string2 = " // Hello.scala"
string1 match {
case JavaFileRegEx(fileName1) => println(" Java file: " + fileName1)
case other => println(other + "--NO_MATCH")
}
string2 match {
case ScalaFileRegEx(fileName2) => println(" Scala file: " + fileName2)
case other => println(other + "--NO_MATCH")
}
我得到这个输出表明 .java 文件匹配但 .scala 文件不匹配。
Java file: Tester
// Hello.scala--NO_MATCH
Java文件匹配而.scala文件不匹配是怎么回事?
【问题讨论】:
-
您在
[^\.scala]和[^\.java]中对字符类的使用都是错误的 -
@rock321987 - 我对“^”字符感到困惑。我认为
[^\.java]的意思是“匹配所有内容直到 .java” -
表示不匹配该集合中的任何字符:
/\|/.|s|c|a|l|a。 hello 包含一个“l”,因此不匹配。我建议您只使用\w而不是字符类。如果 '。'可以是文件名的一部分,然后使用[\w.]。正则表达式的其余部分 (/.scala) 仍然需要匹配。您也可以使用?来确定。 -
例如:
\S*\s+//\\s{1}([\w.]+)\.java. -
Scala 不支持
(?x)修饰符吗?我知道Java可以。将(?x)作为正则表达式中的第一件事,您不必为.replaceAll("(\\s)", "")步骤而烦恼。
标签: java regex string scala pattern-matching