javascript - 字符之间单词的Javascript正则表达式
问题描述
正如标题所述,我尝试为%George%<Croissant>|2|10.3$
关键是它必须只匹配两者之间的名称和两者之间%
的产品<>
,然后是两者之间的数字|
但是,如果名称不是以大写字母后跟小写字母开头,则它是无效的,因此不匹配。我做的正则表达式是:
/%(?<name>[A-Z][a-z]*)%<(?<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
| 之间有一个数字,并且在末尾有一个数字 |valid20$
解决方案
要匹配这两种模式,您可以在 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+)?\$))
团体价格,可选小数部分
推荐阅读
- video-processing - 静态 HDR 和动态 HDR 有什么区别?
- reactjs - Pdf.js pdfjsLib.getDocument() 在 React 中不起作用
- pyspark - pyspark 如何在后台读取整个目录?
- html - 切断时使绝对定位的元素滚动
- mysql - MySQL ALTER 表多列键
- c# - 调用restsharp API获取天气
- c - SetConsoleScreenBufferInfoEx 的工作方式与 SetConsoleTextAttribute 不同
- amazon-web-services - 以零停机时间更新 S3 网站
- matlab - 如何正确使用 fprintf 打印出矩阵?当前打印输出翻转
- javascript - FullCalendar.js 如何在月视图中将日期选择限制为一天