Scala中的动态正则表达式

时间:2019-01-16 01:32:22

标签: regex string scala

我想在表的列名中通过正则表达式提取货币符号,可能是(我现在正在对美元组合(有效的组合-美元,美元,美元)进行此操作,但实际上,我必须迭代一个列表配置文件中的货币并生成通用正则表达式,然后我将使用该正则表达式来解析所有表的所有列):

  • Alpha USD-> USD
  • Alpha_US $ _>美元
  • Alpha($)-> $
  • Alpha _ $$-> X
  • Alpha {USD}-> USD
  • Alpha(USDOCOLAND}-> X
  • 字母(多个空格)USD-> USD
  • 美元Alpha->美元
  • Alpha美元USD-> USD
  • USD-> USD
  • Alpha美元$-> X

X表示不提取
以上所有情况均可与配置文件中的任何有效货币符号互换。

基本上,我必须将单词加上边框,但是它可以用特殊字符包围。

我正在使用Scala并通过在正则表达式字符串上调用Regex创建.r对象

我尝试将\b(US\$|USD)\b用于两种可能的组合,但是可以通过循环配置文件中的列表将其附加更多货币符号。这个问题来自字符串gfgh (US$f) (US$) (USD) USD,它与USD正确匹配,而对于US$,它与第二个单词而不是第四个单词匹配。我正在尝试解决方法,以使US$符合预期(在示例中为第3个字)。

2 个答案:

答案 0 :(得分:1)

这里可以通过除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"
}

将来,如果您希望人们帮助您,请以易于复制和实施的格式发布测试代码。

答案 1 :(得分:1)

它与(US$)不匹配,因为\b之间的单词边界$)不匹配。

匹配示例数据的一种方法可能是使用替换和环顾四周:

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

Regex demo | Scala demo

这将匹配:

  • <={)USD(?=})匹配由{}
  • 包围的美元
  • |
  • (?<=\()USD(?=\))匹配由()包围的USD
  • |
  • \bUSD(?![\S$])匹配USD时不跟非空格字符或$
  • |
  • (?<=\()(?:US)?\$(?=\))匹配可选的US,然后匹配$,并用()包围
  • |
  • US\$(?!\S)匹配US $时,请不要输入非空白字符