繁体   English   中英

RegEx捕获字符串的两个部分

[英]RegEx to Capture Two Parts of String

我在抓一些数据。 其中一个数据点是锦标赛奖池。 数据中有许多不同的货币。 我想从每个值中提取金额和货币,以便我可以使用Google将这些转换为基础货币。 但是,因为我使用正则表达式已经有一段时间了,所以至少可以说是生锈。 可能的数据格式如下:

$534
$22,136.20
3,200,000 Ft HUF
12,500 kr DKK
50,000 kr SEK
$3,800 AUD
$10,000 NZD
€4,500 EUR
¥100,000 CNY
₹7,000,000 INR
R$39,000 BRL

下面是我提出的第一个正则表达式。

[0-9,.]+(.+)[AZ]{3}

但这显然无法捕捉金额和货币,所以我改变了它。

([0-9,.]+).+([AZ]{3})

但是,这个正则表达式存在一些我无法弄清楚的问题。

  1. ([0-9,.]+)本身可以很好地捕获数量。

  2. 当我将.+添加到该表达式时, 由于某种原因,它分别在第一个和第二个测试用例中停止捕获尾随的40 为什么?

  3. 然后当我添加([AZ]{3}) ,它似乎对所有测试用例都很有效,但显然在前两个中没有选择任何东西。

  4. 所以我把它改成了([AZ]{0,3}) ,这似乎打破了一切。

发生了什么? 如何更改表达式以使其有效?

这就是我所在的地方: ([0-9,.]+)((?:.+)([AZ]{3}))?

这应该工作:

([0-9,.]+).*?([A-Z]{3})?$

我做了一些改变:

  • 我将.+更改为.*? 因为数字之后并不总是有东西(比如前两种情况)。 我在这里使用了懒惰匹配,因为否则它会匹配所有内容直到结束。

  • 我做了第2组可选的? 因为并不总是有货币(前2例)

  • 我添加了一个行尾锚$来使懒惰.*? 匹配的东西而不是什么。

如果您不知道“懒惰”在此上下文中的含义,请参阅此帖子

演示

对于示例数据,您可以使用可选的非捕获组来匹配空格和货币之前的字符:

([0-9,.]+)(?:(?: [A-Za-z]+)? ([A-Z]{3}))?

正则表达式演示

这将匹配

  • (捕获组
    • [0-9,.]+匹配字符类中列出的内容的1倍以上
  • )关闭捕获组
  • (?:非捕获组
    • (?: [A-Za-z]+ )? 可选组匹配空格,1-a次a-zA-Z和空格
    • ([AZ]{3})捕获3个大写字符
  • )? 关闭非捕获组并使其可选

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM