REGEX只匹配第一次出现的字符串

时间:2018-12-05 16:53:10

标签: php regex

我遇到了麻烦,将字符串分解成数组或匹配模式。 这是字符串:

Purchased:
12/7/11

58 - $2.5 Gold Coin @ $341.00
290 - Silver Dollar @ $36.02

Total - $500000.00

我想解析此字符串并返回一个多维数组,如下所示:

Array
(
  [0] => Array
    (
        [0] => 58 - $2.5 Gold Coin @ $341.00
        [1] => 290 - Silver Coin @ $36.02  
    )

[1] => Array
    (
        [0] => 58
        [1] => 290
    )

[2] => Array
    (
        [0] => $2.5 Gold Coin
        [1] => Silver Coin
    )

[3] => Array
    (
        [0] => 341.00
        [1] => 36.02
    )

[4] => Array
    (
        [0] => .00
        [1] => .02
    )
)

到目前为止,我有这个:

\s*?\n(\d*\.?\d*)\s-\s(.*?)\s\$(\d+(\.\d+)?\.?[0-9]*)

但是当产品名称中带有美元符号(例如:“ $ 2.5金币”)时,捕获组将无法工作

我想知道是否有一种方法只能从以'@ $'开头的字符串中获取金额。

我一直在使用https://regex101.com/进行尝试,这是一个很棒的工具,但还没有带来乐趣。

1 个答案:

答案 0 :(得分:1)

您可以使用

^(\d*\.?\d+)\s*-\s*(?:VF\s+)?(.*)\s@\s\$(\d+(\.\d+)?)

请参见regex demo

详细信息

  • ^-字符串的开头
  • (\d*\.?\d+)-第1组:0位以上的数字,可选的.和1位以上的数字
  • \s*-\s*--内含0+空格
  • (?:VF\s+)?-可选的非捕获组:VF和1+个空格
  • (.*)-第2组:尽可能多的除换行符以外的0+个字符
  • \s@\s-用1个空格括起来的@
  • \$-一个$字符
  • (\d+(\.\d+)?)-第3组:1个或更多数字,后跟一个可选的第4组,先匹配一个点,再匹配1+个数字。