[英]Javascript regex for words between characters
正如标题所述,我尝试为%George%<Croissant>|2|10.3$
制作正则表达式
关键是它必须只匹配两个%
之间的名称和两个<>
之间的产品,然后是|
之间的数字。
但是,如果名称不是以大写字母开头且后跟小写字母,则它是无效的,因此不匹配。 我制作的正则表达式是:
/%(?<name>[AZ][az]*)%<(?<product>[A-Za-z]*)>\|(?<quantity>(\d+))\|(?<price>(\d+\.\d*\$))/g
这是匹配%George%<Croissant>|2|10.3$
(在 % 之间有专有名称,% 以大写字母开头,后面跟着小写字母),产品(产品在 < 和 > 之间) , 两者之间的数字 | 和最终数字(这是最终数字,必须有 $ 才能有效)
这与%InvalidName%<Croissant>|2|10.3$
不匹配(因为名称无效)
这与%Peter%<Gum>1.3$
不匹配(两个 | 中都缺少数字,它必须有 2 个数字。
在 regex101 上测试,它只匹配%George%<Croissant>|2|10.3$
。
%Valid%<Valid>valid|10|valid20$
也是有效的,因为它有一个专有名称(1 个大写字母后跟小写字母,产品为 < Valid
>,编号介于 | 10
| 之间,编号位于结束|有效20$
要匹配这两种模式,您可以匹配可选的单词字符\w*\|
在组quantity的 pipe 之前,并匹配组price之前没有数字y>(\d+))
的可选单词字符。
要匹配这两个价格,您必须将小数部分设为可选,因为您尝试的模式需要至少 1 个或多个数字和一个使用\d+\.\d*
的点
您还可以在数量上省略额外的捕获组,因为数字已经在命名的捕获组中。
%(?<name>[A-Z][a-z]*)%<(?<product>[A-Za-z]*)>\w*\|(?<quantity>\d+)\|[^\W\d]*(?<price>(\d+(?:\.\d+)?\$))
解释
%(?<name>[AZ][az]*)%
%
的组name
,至少匹配一个大写字符 AZ 和可选的小写字符 az<(?<product>[A-Za-z]*)>
product
组匹配可选字符 A-Za-z\w*\|
匹配可选的单词字符,然后匹配|
(?<quantity>(\d+))
\|[^\W\d]*
匹配不带数字的可选单词字符(不超过数字)(?<price>(\d+(?:\.\d+)?\$))
组价,小数部分可选试试这个
%(?<name>[A-Z][a-z]*?)%<(?<product>[A-Za-z]*)>[^|]*?\|(?<quantity>\d+)\|[^\d]*(?<price>\d+(?:\.\d+)*\$)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.