如何首先从 RegExp 中由 OR 运算符分隔的多个单词中匹配更大的单词?使用 java 脚本

how to match bigger word first, from multiple words separated by OR operator in RegExp ? using java script

我需要一个正则表达式来首先匹配后面有 '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 个以上的数字,后跟一个可选的 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

its not matching 'px' its only matching 'p'

那是因为 (p|px)? 替换没有锚定在模式末尾,第一个替换 always 获胜,因为 ppx,参见 "Remember That The Regex Engine Is Eager"

你可以做的是交换备选方案,(px|p)?,或重写 (?:px?)?。此外,您可以在此处使用非捕获组来避免与捕获内存分配相关的额外开销:

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.