下面的正则表达式匹配数字后面这个千字符的所有内容。我希望仅当千存在时才能匹配,但如果后面跟着伏或吨,则不能
\(\d{1,}(?:\,?\d{3})*(?:\.\d+)?[ ]?)(!千伏|!千吨|千)\目前:
220千伏 (match '220千')
220千吨 (match '220千')
220千 (match '220千')期望值:
220千伏 (no match)
220千吨 (no match)
220千 (match '220千')发布于 2019-05-15 03:41:02
我的猜测是,您可能想要有一个列表来排除某些东西,并有其他特定的字符,可能类似于:
\d{1,}(?:\,?\d{3})*(?!千伏|千吨)(?:千)RegEx
您可以在regex101.com中设计/修改/更改表达式。

RegEx电路
您可以在jex.im中可视化表达式

JavaScript测试
const regex = /\d{1,}(?:\,?\d{3})*(?!千伏|千吨)(?:千)/gm;
const str = `220千伏
220千吨
220千`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
此外,您可能不想转义非元参数,就像Barmar建议的那样,您可以修改表达式的这一部分:
\d{1,}(?:\,?\d{3})*发布于 2019-05-15 03:57:45
有关regex的工作版本,请参阅以下内容。
主要思想是使用千(?![伏吨]),这是一个文字千,后面跟着一个负面的先行断言( [ ]通常只是一个字符类)。它与千匹配,但前提是后面不跟伏或吨。
(我还删除了多余的圆括号,将{1,}更改为+,并将匹配锚定在字符串的开头。如果您不希望这样,那么至少可以考虑在开头使用\b (单词边界)锚点。)
const inputs = [
'220千伏',
'220千吨',
'220千',
];
for (const str of inputs) {
console.log(
str + (
/^\d+(?:,\d{3})*(?:\.\d+)?[ ]?千(?![伏吨])/.test(str)
? ' (match)'
: ' (no match)'
)
);
}
https://stackoverflow.com/questions/56137397
复制相似问题