我想在表的列名中通过正则表达式提取货币符号,可能是(我现在正在对美元组合(有效的组合-美元,美元,美元)进行此操作,但实际上,我必须迭代一个列表配置文件中的货币并生成通用正则表达式,然后我将使用该正则表达式来解析所有表的所有列):
X表示不提取
以上所有情况均可与配置文件中的任何有效货币符号互换。
基本上,我必须将单词加上边框,但是它可以用特殊字符包围。
我正在使用Scala并通过在正则表达式字符串上调用Regex
创建.r
对象
我尝试将\b(US\$|USD)\b
用于两种可能的组合,但是可以通过循环配置文件中的列表将其附加更多货币符号。这个问题来自字符串gfgh (US$f) (US$) (USD) USD
,它与USD正确匹配,而对于US$
,它与第二个单词而不是第四个单词匹配。我正在尝试解决方法,以使US$
符合预期(在示例中为第3个字)。
答案 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)
这将匹配:
<={)USD(?=})
匹配由{} |
或(?<=\()USD(?=\))
匹配由()包围的USD |
或\bUSD(?![\S$])
匹配USD时不跟非空格字符或$
|
或(?<=\()(?:US)?\$(?=\))
匹配可选的US
,然后匹配$
,并用()包围|
或US\$(?!\S)
匹配US $时,请不要输入非空白字符