首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于匹配数字并在特殊字符上失败的RegEx

用于匹配数字并在特殊字符上失败的RegEx
EN

Stack Overflow用户
提问于 2019-05-15 03:31:56
回答 2查看 43关注 0票数 0

下面的正则表达式匹配数字后面这个字符的所有内容。我希望仅当存在时才能匹配,但如果后面跟着,则不能

代码语言:javascript
复制
\(\d{1,}(?:\,?\d{3})*(?:\.\d+)?[ ]?)(!千伏|!千吨|千)\

目前:

代码语言:javascript
复制
220千伏 (match '220千')
220千吨 (match '220千')
220千 (match '220千')

期望值:

代码语言:javascript
复制
220千伏 (no match)
220千吨 (no match)
220千 (match '220千')
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-15 03:41:02

我的猜测是,您可能想要有一个列表来排除某些东西,并有其他特定的字符,可能类似于:

代码语言:javascript
复制
\d{1,}(?:\,?\d{3})*(?!千伏|千吨)(?:千)

RegEx

您可以在regex101.com中设计/修改/更改表达式。

RegEx电路

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

JavaScript测试

代码语言: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建议的那样,您可以修改表达式的这一部分:

代码语言:javascript
复制
\d{1,}(?:\,?\d{3})*
票数 2
EN

Stack Overflow用户

发布于 2019-05-15 03:57:45

有关regex的工作版本,请参阅以下内容。

主要思想是使用千(?![伏吨]),这是一个文字,后面跟着一个负面的先行断言( [ ]通常只是一个字符类)。它与千匹配,但前提是后面不跟伏或吨。

(我还删除了多余的圆括号,将{1,}更改为+,并将匹配锚定在字符串的开头。如果您不希望这样,那么至少可以考虑在开头使用\b (单词边界)锚点。)

代码语言:javascript
复制
const inputs = [
  '220千伏',
  '220千吨',
  '220千',
];

for (const str of inputs) {
  console.log(
    str + (
      /^\d+(?:,\d{3})*(?:\.\d+)?[ ]?千(?![伏吨])/.test(str)
        ? ' (match)'
        : ' (no match)'
    )
  );
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56137397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档