试图找到正确的正则表达式以获取除引号之外的数字。对于为例,在:获取报价正则表达式之外的数字
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(这似乎是正常的)。
谢谢你的帮助!
试图找到正确的正则表达式以获取除引号之外的数字。对于为例,在:获取报价正则表达式之外的数字
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(这似乎是正常的)。
谢谢你的帮助!
假设单引号是平衡的,没有转义序列被认为是,你可以匹配'...'
子,并匹配和捕捉其他情况下所有数字块(见更多关于这项技术在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);
嗯,正则表达式工作正常,但是当我尝试在代码中使用'replace'时,它实现了它应该为数字做的事情,并且将我所引用的所有东西都改为'undefined'(这不是很酷) – PaaBliiTo
Meh,刚刚添加了一个条件现在它可以工作。非常感谢您的帮助 ! – PaaBliiTo
@PaaBliiTo:对不起,我出去散步(注意编码是你为了生活所做的事情,这非常重要!)。如果你提到你需要*替换*,我会提供它。如果您需要替换*数字*,则需要在'replace'中使用回调。如果你需要*删除*,你需要捕捉你需要保留的部分,并使用'$ 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);
}
});
}
如果''...'内有非数字字符(例如'aa 2'e45'3'),这将不起作用。另外,'if(m.index === regex.lastIndex){regex。lastIndex的++; }'是多余的,你不期望在这里有任何零长度的匹配。 –
你是对的,我的工作原始问题,但你的也处理这种情况。 –
此外,在开始时使用单个否定字符类将会阻止字符串开头的匹配数字。一个常见的解决方法是在字符串锚的开始处使用交替:'(^ | [^'])' –
字符串是否可以包含转义序列? '1 \'2 \'33'' - >然后'1'和'2'预计? –
为什么不只是'.replace(/'\ d +'/ g,'')'然后将结果字符串与数字匹配? – user7929528
@WiktorStribiżew在你的例子中,'1'是预期的,但不是'2'和'3' – PaaBliiTo