如何从 RegExp 中由 OR 运算符分隔的多个单词中首先匹配更大的单词?使用 java 脚本
Posted
技术标签:
【中文标题】如何从 RegExp 中由 OR 运算符分隔的多个单词中首先匹配更大的单词?使用 java 脚本【英文标题】:how to match bigger word first, from multiple words separated by OR operator in RegExp ? using java script 【发布时间】:2021-09-28 06:40:14 【问题描述】:我需要一个正则表达式来首先匹配后面带有“px”的数字,然后匹配后面带有“p”的剩余数字。 我想用 '*' 字符替换部分字符串,即数字或后面有 'p' 或 'px' 的数字。
我尝试了一个正则表达式/\d+(\.\d+)?(p|px)?/g
,但它不匹配'px',它唯一匹配'p'。
我尝试的以下代码正在替换数字和“p”而不是“px”。
str = "12pxy...12py...12px...12ppx...12...12ypx";
replaced_str = str.replace(/\d+(\.\d+)?(p|px)?/g, '*');
console.log(replaced_str);
// output is: *xy...*y...*x...*px...*...*ypx
// I wanted : *y...*y...*...*px...*...*ypx
【问题讨论】:
只是出于好奇,您正在构建什么?为什么会有特定的输出? 【参考方案1】:对于给定的示例,您可以匹配 1+ 个数字,后跟可选的 p 和可选的 x。
\d+p?x?
Regex demo
还匹配小数部分:
\d+(?:\.\d+)?p?x?
模式匹配:
\d+
匹配 1+ 个数字
(?:\.\d+)?
匹配可选的小数部分
p?x?
匹配可选的p
和可选的x
Regex demo
并替换为*
str = "12pxy...12py...12px...12ppx...12...12ypx";
replaced_str = str.replace(/\d+p?x?/g, '*');
console.log(replaced_str);
输出
*y...*y...*...*px...*...*ypx
【讨论】:
感谢您的解决方案,我使用了它,但我接受了@Wiktor 的回答,因为它回答了我提出问题的思考过程。【参考方案2】:它不匹配'px'它唯一匹配'p'
那是因为(p|px)?
替代没有锚定在模式末尾,并且第一个替代总是 获胜,因为p
是px
的前缀,请参阅"Remember That The Regex Engine Is Eager"。
你可以做的是交换替代品(px|p)?
,或者重写(?:px?)?
。此外,您可以在此处使用非捕获组来避免与捕获 mmemory 分配相关的额外开销:
str = "12pxy...12py...12px...12ppx...12...12ypx";
replaced_str = str.replace(/\d+(?:\.\d+)?(?:px?)?/g, '*');
console.log(replaced_str);
// output: *y...*y...*...*px...*...*ypx
请参阅regex demo。 详情:
\d+
- 一位或多位数字
(?:\.\d+)?
- 点和一个或多个数字的可选出现
(?:px?)?
- p
的可选出现后跟可选的x
。
【讨论】:
以上是关于如何从 RegExp 中由 OR 运算符分隔的多个单词中首先匹配更大的单词?使用 java 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Oracle 中的 regexp_replace 从逗号分隔列表中删除重复项?
如何通过 Oracle regexp_replace 中的正则表达式从逗号分隔列表中删除重复项? [复制]
Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]