我有以下正则表达式尝试解析字符串中的价格:
$pattern = '#([Ii][Dd][Rr].?\s*[0-9.,]+)|
([Rr][Pp].?\s*[0-9.,]+)|
([Pp][Rr][Ii][Cc][Ee]:?\s*[0-9.,]+)|
(\s[0-9]+\s?[Kk]\s)|
([0-9]+[Rr][Bb])|
([0-9.,]+\s*[Rr][Ii][Bb][Uu])|
(\b[0-9]+[.,][0-9]+[.,]?[0-9]+)#u';
$matches = array();
preg_match($pattern, $caption, $matches);
使用以下字符串进行测试时:
"ABBY TOP
Colour : POLKA BLACK
Weight : 0,18
Price : 185,000
Material : Kaos Semi-Fleece
Size : Panjang / Length: 55 cm (depan), 72 (belakang)"
这总是将0.18
解析为价格,而我希望Price: 185,000
成为实际价格。
我的正则表达式有什么问题吗?
答案 0 :(得分:1)
没有冒犯,但......在我给你答案之前,让我指出你在你的正则表达式中应用的许多修正。
在您尝试双重案例匹配时,[Ii][Dd][Rr]
不是一个好主意:像往常一样使用idr
,但请加入case-i
nsensitive flag: #i
Using \d
over [0-9]
makes the world happier.
此外,您的价格条目为Price : 185,000
,但由于冒号前的空格,子模式([Pp][Rr][Ii][Cc][Ee]:?\s*[0-9.,]+)
将无法捕获它。添加\s*
。
另见:
现在回到考虑优先级。您可以使用this other answer of mine中的相同技术,这会产生正则表达式:
/^.*?\Kidr.?\s*[\d.,]+|
.*?\Krp.?\s*[\d.,]+|
.*?\Kprice:?\s*[\d.,]+|
.*?\K\s\d+\s?k\s|
.*?\K\d+rb|
.*?\K[0-9.,]+\s*ribu|
.*?\K\b\d+[.,]\d+[.,]?\d+/xis
Regex101 Demo