Scala Regex положительный и отрицательный взгляд в то же время - PullRequest
3 голосов
/ 16 октября 2019

У меня есть такая строка ввода

val input = """["abc:def&ghi:jkl"]"""

Я хочу извлечь abc и ghi Так что я написал это регулярное выражение, которое работает

val regex = """(?<=["&])(\w+)(?=[:])""".r
regex.findAllIn(input).foreach(println)

Так что в основном у меня естьвзгляд вперед на : и взгляд на " или &.

Пока все хорошо. Но теперь у меня есть такой ввод:

val input = """["abc:de_&_f:xyz&ghi:jkl"]"""

, он соответствует

abc
_f
ghi

Я хочу изменить логику своего регулярного выражения.

Совпадение с \w+, когда прогноз вперед - это верно для :, а взгляд назад - для & и false для _&_

Так что я хочу использовать положительные и отрицательные значенияоглянуться в то же время. Как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 16 октября 2019

Вы можете добавить отрицательный взгляд назад и отрицательный взгляд назад в выражении просмотра назад в вашем регулярном выражении как:

(?<=(?:(?<!_)&(?!_)|"))\w+(?=:)

RegEx Demo

Здесь мы используемчередование в условии просмотра назад, которое:

  • (?<!_)&(?!_)|": сопоставить &, если ему не предшествует, а затем следует _
  • |: ИЛИ
  • " match "

В вашем случае это короткое регулярное выражение также может работать:

(?<=["&])(?<!_&)\w+(?=:)

RegEx Demo 2

(?<!_&) пропустит матч, если \w+ предшествует _&.

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

Вы можете обновить свой шаблон, чтобы он не совпадал с подчеркиванием в \w, сначала используя отрицательный класс символов [^\W_]\w*

Поскольку вы хотите только одно совпадение, вы можете опустить группу захвата () иквадратные скобки в [:] могут быть опущены.

(?<=["&])[^\W_]\w*(?=:)
  • (?<=["&]) Положительный взгляд сзади, подтвердите, что слева есть " или &
  • [^\W_] Соответствует слову char, кроме _
  • \w* Соответствует 0+ символам слова
  • (?=:) Положительный взгляд вперед, утверждают, что справа - :

Regex demo | Scala demo

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