【问题标题】:RegEx with ISO Currency and String Match [duplicate]具有 ISO 货币和字符串匹配的正则表达式 [重复]
【发布时间】:2019-08-26 19:33:21
【问题描述】:

我有以下正则表达式:

^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

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

【问题讨论】:

  • 为什么你的模式中有锚点? (^$)?
  • 我不太确定 - 这不需要吗?我需要寻找模式~currencyCode~

标签: regex


【解决方案1】:

^$ 断言在您的正则表达式中是不必要的,因为您尝试匹配的子字符串既不是字符串的开头也不是字符串的结尾,而^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

【讨论】:

  • 这个答案和另一个答案有什么区别?你怎么没有在这里添加检查〜?谢谢!
  • 不同之处在于您要查找的子字符串在输入字符串中的位置不同。由于您没有明确说明输入字符串必须绑定的确切格式,因此我们只是通过观察输入来做出不同的假设。我假设货币子字符串之前和取代的是非单词,而@JDB 假设它之前和取代的是~。我选择使用\b,因为它被更多的正则表达式引擎支持。例如,JavaScript 不支持 @JDB 的答案中使用的后向断言 (?<=)
【解决方案2】:

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

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

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

这将匹配6:00~USD~305 中的USD,因为它被~ 包围,但不匹配7CCADEB0 中的CAD,因为它没有被它们包围。

【讨论】:

  • 我正在使用 JavaScript。 (?
  • @Michael (?&lt;=) 被称为lookbehind。 (?=) 称为前瞻。您可以查看链接以获得更详尽的说明。
  • 您或其他人能否使用组捕获解释此答案与以下答案的正则表达式有何区别?
  • 零宽度断言是一个大主题,不适合 SO 帖子。我建议您阅读我链接到的文章以获取更多信息。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
相关资源
最近更新 更多