2017-05-05 83 views
1

试图找到正确的正则表达式以获取除引号之外的数字。对于为例,在:获取报价正则表达式之外的数字

444545564 fcf456 f46 ref 464 f64ff4rfrfr'45'4778,458 

我想只得到

444545564 456 46 464 64 4 4778 458 

我现在用这样的正则表达式:

[^'a-z\/,\s]\d+[^'a-z\/,\s] 

但事实是,它不给我3位数字如46,64或4(这似乎是正常的)。

谢谢你的帮助!

+1

字符串是否可以包含转义序列? '1 \'2 \'33'' - >然后'1'和'2'预计? –

+0

为什么不只是'.replace(/'\ d +'/ g,'')'然后将结果字符串与数字匹配? – user7929528

+0

@WiktorStribiżew在你的例子中,'1'是预期的,但不是'2'和'3' – PaaBliiTo

回答

1

假设单引号是平衡的,没有转义序列被认为是,你可以匹配'...'子,并匹配和捕捉其他情况下所有数字块(见更多关于这项技术在The Best Regex Trick Ever (at last!)):

/'[^']*'|(\d+)/g 

详细

  • '[^']*' - '随后与012相比其他0+字符然后'
  • | - 或
  • (\d+) - 第1组捕获一个或多个数字。
下面

见JS演示:

var s = "444545564 fcf456 f46 ref 464 f64ff4rfrfr'45'4778,458"; 
 
var res = [], m; 
 
var rx = /'[^']*'|(\d+)/g; 
 
while(m=rx.exec(s)) { 
 
    if (m[1]) res.push(m[1]); 
 
} 
 
console.log(res);

+0

嗯,正则表达式工作正常,但是当我尝试在代码中使用'replace'时,它实现了它应该为数字做的事情,并且将我所引用的所有东西都改为'undefined'(这不是很酷) – PaaBliiTo

+0

Meh,刚刚添加了一个条件现在它可以工作。非常感谢您的帮助 ! – PaaBliiTo

+0

@PaaBliiTo:对不起,我出去散步(注意编码是你为了生活所做的事情,这非常重要!)。如果你提到你需要*替换*,我会提供它。如果您需要替换*数字*,则需要在'replace'中使用回调。如果你需要*删除*,你需要捕捉你需要保留的部分,并使用'$ 1'反向引用替换模式中的该组。很高兴你知道你自己。 –

1

您可以使用此一个/[^'](\d+)(?!')/g和使用1组

const regex = /[^'](\d+)(?!')/g; 
 
const str = `444545564 fcf456 f46 ref 464 f64ff4rfrfr'45'4778,458`; 
 
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(function(match, groupIndex) { 
 
     if(groupIndex === 1) { 
 
      console.log(match); 
 
     } 
 
    }); 
 
}

+0

如果''...'内有非数字字符(例如'aa 2'e45'3'),这将不起作用。另外,'if(m.index === regex.lastIndex){regex。lastIndex的++; }'是多余的,你不期望在这里有任何零长度的匹配。 –

+0

你是对的,我的工作原始问题,但你的也处理这种情况。 –

+0

此外,在开始时使用单个否定字符类将会阻止字符串开头的匹配数​​字。一个常见的解决方法是在字符串锚的开始处使用交替:'(^ | [^'])' –