Регулярное выражение не должно содержать символ, если - PullRequest
1 голос
/ 02 октября 2019

Если у меня есть строка типа

foo&bar&baz

, и я хочу извлечь из нее токены foo, bar, baz. регулярное выражение легко написать

val regex = "([^&]+)".r
regex.findAllIn("foo&bar&baz").map(_.toString).toList

Это дает мне ответ, который я хочу.

List("foo", "bar", "baz")

Но на входе может быть символ & экранирован с помощью _&_

Так что, если вход

foo_&_bar&baz

Выход должен быть foo & bar, baz.

Я гуглил и нашел эту тему, у которой есть похожая проблема

RegEx запрещает символ, если не экранирован

На основании этой темы я изменил свое регулярное выражение на

val regex = "((?:_&_|[^&]*)+)".r

Но это не работает, вывод

List("foo_", "", "_bar", "", "baz", "")

1 Ответ

2 голосов
/ 02 октября 2019

Вы можете использовать

val regex = "(?:_&_|[^&])+".r
println( regex.findAllIn("foo_&_bar&baz").map(_.toString).toList )
// => List(foo_&_bar, baz)

См. Демонстрацию регулярных выражений и демонстрацию Scala .

Регулярное выражение (?:_&_|[^&])+ соответствует 1 илибольше повторений _&_ или, если не найдено в текущем местоположении, символ, отличный от &.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...