如何首先从 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'.
- 示例字符串,在对其进行任何替换之前。: 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 个以上的数字,后跟一个可选的 p 和一个可选的 x。
\d+p?x?
也匹配小数部分:
\d+(?:\.\d+)?p?x?
模式匹配:
\d+
匹配 1+ 个数字
(?:\.\d+)?
匹配一个可选的小数部分
p?x?
匹配一个可选的p
和可选的x
并替换为 *
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 获胜,因为 p
是 px
,参见 "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
.
我需要一个正则表达式来首先匹配后面有 '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 个以上的数字,后跟一个可选的 p 和一个可选的 x。
\d+p?x?
也匹配小数部分:
\d+(?:\.\d+)?p?x?
模式匹配:
\d+
匹配 1+ 个数字(?:\.\d+)?
匹配一个可选的小数部分p?x?
匹配一个可选的p
和可选的x
并替换为 *
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 获胜,因为 p
是 px
,参见 "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
.