首页 > 解决方案 > 字符之间单词的Javascript正则表达式

问题描述

正如标题所述,我尝试为%George%<Croissant>|2|10.3$

关键是它必须只匹配两者之间的名称和两者之间%的产品<>,然后是两者之间的数字|

但是,如果名称不是以大写字母后跟小写字母开头,则它是无效的,因此不匹配。我做的正则表达式是:

/%(?<name>[A-Z][a-z]*)%<(?<product>[A-Za-z]*)>\|(?<quantity>(\d+))\|(?<price>(\d+\.\d*\$))/g

在 regex101 测试,它只匹配%George%<Croissant>|2|10.3$.

%Valid%<Valid>valid|10|valid20$也是有效的,因为它有一个专有名称(1 个大写字母后跟只有小写字母,产品是 < Valid>,在 | 10| 之间有一个数字,并且在末尾有一个数字 |valid20$

标签: javascriptregex

解决方案


要匹配这两种模式,您可以在 group quantity\w*\|的管道之前匹配可选单词字符,并在 group price之前匹配不带数字的可选单词字符。y>(\d+))

要匹配两个价格,您必须将小数部分设为可选,因为您尝试的模式需要至少 1 个或多个数字和一个点\d+\.\d*

您还可以在数量上省略额外的捕获组,因为数字已经在命名的捕获组中。

%(?<name>[A-Z][a-z]*)%<(?<product>[A-Za-z]*)>\w*\|(?<quantity>\d+)\|[^\W\d]*(?<price>(\d+(?:\.\d+)?\$))

解释

  • %(?<name>[A-Z][a-z]*)%name在 之间分组%,至少匹配一个大写字符 AZ 和可选的小写字符 az
  • <(?<product>[A-Za-z]*)>product匹配可选字符 A-Za-z
  • \w*\|匹配可选的单词字符,然后匹配|
  • (?<quantity>(\d+))
  • \|[^\W\d]*匹配没有数字的可选单词字符(不超过数字)
  • (?<price>(\d+(?:\.\d+)?\$))团体价格,可选小数部分

正则表达式演示


推荐阅读