我遇到了麻烦,将字符串分解成数组或匹配模式。 这是字符串:
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/进行尝试,这是一个很棒的工具,但还没有带来乐趣。
答案 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+个数字。