Динамическое регулярное выражение в Scala - PullRequest
0 голосов
/ 16 января 2019

Я хочу извлечь знак валюты с помощью регулярного выражения в имени столбца таблицы, и это может быть (я делаю это для комбинаций долларов США (действительные - доллары США, доллары США, $) сейчас, но на самом деле, я должен повторить один список валюта из файла конфигурации и сделать общее регулярное выражение, а затем я буду использовать это регулярное выражение для анализа всех столбцов всех таблиц):

  • Альфа USD -> USD
  • Alpha_US $ _> US $
  • Альфа ($) -> $
  • Альфа _ $$ -> X
  • Альфа {USD} -> USD
  • Альфа (USDOCOLAND} -> X
  • Альфа (несколько пробелов) USD -> USD
  • USD Альфа -> USD
  • Альфа USD USD -> USD
  • USD -> USD
  • Альфа USD $ -> X

X означает отсутствие извлечения
Все вышеперечисленные случаи взаимозаменяемы с любым действительным символом валюты, поступающим из файла конфигурации.

По сути, мне нужно ограничить слово, и оно может быть окружено специальными символами.

Я использую Scala и создаю Regex объект, вызывая .r в строке регулярного выражения

Я пытался использовать \b(US\$|USD)\b для двух возможных комбинаций, но к нему можно добавить больше символов валюты, просматривая список из файла конфигурации. Проблема с этим из строки gfgh (US$f) (US$) (USD) USD, она соответствует USD правильно, а для US$, это соответствует 2-му слову, а не 4-му. Я пытаюсь обойти, чтобы получить US$ совпадение, как и ожидалось (3-е слово в моем примере).

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Не соответствует (US$), поскольку граница слова \b не совпадает между $).

Один из способов сопоставления данных в вашем примере может заключаться в использовании чередований и обходных путей:

(?<={)USD(?=})|(?<=\()USD(?=\))|\bUSD(?![\S$])|(?<=\()(?:US)?\$(?=\))|US\$(?!\S)

Regex demo | Scala demo

Это будет соответствовать:

  • <={)USD(?=}) Матч USD в окружении {}
  • | или
  • (?<=\()USD(?=\)) Матч USD в окружении ()
  • | или
  • \bUSD(?![\S$]) Матч USD, если за ним не следует непробельный символ или $
  • | или
  • (?<=\()(?:US)?\$(?=\)) Совпадение необязательно US, за которым следует $ в окружении ()
  • | или
  • US\$(?!\S) Соответствует US $, если за ним не следует непробельный символ
0 голосов
/ 17 января 2019

Вот что-то, что проходит все, кроме 2 ваших тестов.

val txt = Vector("Alpha USD"         // -> USD
                ,"Alpha_US$"         // _> US$
                ,"Alpha($)"          // -> $
                ,"Alpha_$$"          // -> X desired but $ found
                ,"Alpha{USD}"        // -> USD
                ,"Alpha(USDOCOLAND}" // -> X
                ,"Alpha    USD"      // -> USD
                ,"USD Alpha"         // -> USD
                ,"Alpha USD USD"     // -> USD
                ,"USD"               // -> USD
                ,"Alpha USD$"        // -> X desired but USD found
                )

val re = """(US[D$]|\$)(?:\W|$)""".r.unanchored
txt.map{
  case re(a) => a
  case _ => "X"
}

В будущем, если вы хотите, чтобы люди помогали вам, опубликуйте тестовый код в формате, который можно легко скопировать и внедрить.

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