У меня есть два экстрактора регулярных выражений.Scala RegEx String экстракторы ведут себя непоследовательно
Один для .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
@ rock321987 - Я смущен символом «^». Я думал, что '[^ \. Java]' означало "соответствовать всем до тех пор, пока .java" –
означает, что это не соответствует ** символу ** в этом наборе: '/\|/.|s|c|a|l | a'. hello содержит «l», поэтому он не соответствует. Я рекомендую вам просто использовать '\ w' вместо классов символов. Если '.' может быть частью имени файла, а затем использовать '[\ w.]'. Остальное регулярное выражение ('/ .scala') все равно должно совпадать. Вы также можете использовать '?', Чтобы быть уверенным. – micsthepick