如何从 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'。

示例字符串,在对其进行任何替换之前。:12pxy...12py...12px...12ppx...12...12ypx 此处应替换的部分以粗体显示:12pxy...12py...12px...12ppx...12...12ypx 进行所有替换后的预期结果:*y...*y...*...*px...*...*ypx

我尝试的以下代码正在替换数字和“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)? 替代没有锚定在模式末尾,并且第一个替代总是 获胜,因为ppx 的前缀,请参阅"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 从管道分隔的字符串中提取值

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]

regexp_substr 用于换行的模式,其中分隔符是换行符。甲骨文 19c

如何使用 talend 在 hive 上的分隔符 nth 之间进行 regexp_extract