2017-05-05 40 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

此外,在開始時使用單個否定字符類將會阻止字符串開頭的匹配數​​字。一個常見的解決方法是在字符串錨的開始處使用交替:'(^ | [^'])' –