Regex 带有ISO货币和字符串匹配的正则表达式

Regex 带有ISO货币和字符串匹配的正则表达式,regex,Regex,我有以下正则表达式: ^USD | AUD | BRL | GBP | CAD | CNY | DKK | AED | EUR | HKD | INR | MYR | MXN | NZD | PHP | SGD | THB | ARS | COP CLP | PEN | VEF$ 使用此示例字符串时:16ccf52b144~~refCode-3-d5779a89-d437-448a-bf53-efad2cdd66f6~20191020T16:00~20191026T16:00~USD~305.8

我有以下正则表达式:

^USD | AUD | BRL | GBP | CAD | CNY | DKK | AED | EUR | HKD | INR | MYR | MXN | NZD | PHP | SGD | THB | ARS | COP CLP | PEN | VEF$

使用此示例字符串时:
16ccf52b144~~refCode-3-d5779a89-d437-448a-bf53-efad2cdd66f6~20191020T16:00~20191026T16:00~USD~305.81~~~~**8294A2B49CD60ABE4FC7081F05CD06AA17E837CCADEB0ABC57B6AC94B09882FB


我希望正则表达式返回美元,而不是返回CAD。如何编辑正则表达式以使其返回USD…理想情况下,正则表达式应该查看
~currencyCode
…而不是现在它正在查看
currencyCode
,而不使用波浪线。

正则表达式中的
^
$
断言是不必要的,因为您尝试匹配的子字符串既不在开头,也不在后面字符串的结尾,以及
^
USD
之前这一事实意味着模式只能匹配
USD
,如果它位于字符串的开头

相反,将备选方案分组,并用单词边界断言将其包围:

\b(?:USD|AUD|BRL|GBP|CAD|CNY|DKK|AED|EUR|HKD|INR|MYR|MXN|NZD|PHP|SGD|THB|ARS|COP|CLP|PEN|VEF)\b

您还没有说您使用的是哪种语言或框架,所以我假设您需要一个普遍适用的正则表达式

如果您知道
~
将位于您的货币之前和之后,那么您可以使用查找
~
字符之间的文本,如下所示:

(?<=~)(USD|AUD|BRL|GBP|CAD|CNY|DKK|AED|EUR|HKD|INR|MYR|MXN|NZD|PHP|SGD|THB|ARS|COP|CLP|PEN|VEF)(?=~)

(?为什么您的模式中有锚?(
^
$
)?我不太确定-这不是必需的吗?我需要查找模式~currencyCode~我正在使用JavaScript。(?@Michael
(?你或其他人能用群组捕获的方法解释一下这个答案和下面的答案在正则表达式中的区别吗?零宽度断言是一个很大的主题,不适合SO帖子。我建议你阅读我链接的文章以获取更多信息。这个答案和其他答案之间的区别是什么?你为什么没有添加检查~here?谢谢!区别在于您要查找的子字符串位于输入字符串中的不同假设。由于您没有明确说明输入字符串必须绑定的确切格式,我们只是通过观察输入来做出不同的假设。我假设货币子字符串s前面有一个非单词并用它代替,而@JDB则假定它前面有一个
~
并用它代替。我选择使用
\b
,因为它受到更多正则表达式引擎的支持。lookbehind断言
(?)?