2017-06-23 73 views
1

我試圖做到:匹配所有出現次數沒有任何信件之後或之前

假設一個例子字符串:

1 this is a1 my test 1a 12 string 12.123 whatever 1 

我想有一個正則表達式,這會給我所有數字的出現(包括浮點數),但是如果一個字母(或者更一般地說:非數字)在它之前或之後,我希望它跳過數字。因此a11a不匹配。

我一直在爲此而努力了一段時間,我得到了這一點(不理想,因爲它也抓住前面的空間):

/(^|\s)\d*\.*\d+/g 

但是,這也將趕上1a實例.. 。我也可以設置類似的東西,這會跳過1a,但會趕上a1 ...

我可以使用正則表達式匹配來實現這個嗎?

+1

如何...正數和負數「+ 1」或「-1」?指數符號'1e1'?數字分隔符「1,000,000.00」還是「1 000 000」? –

+0

我並不需要這種指數表示法。數字分隔符確實是一個很酷的加法(除了空格之外,因爲在這種情況下這些應該被視爲單獨的數字)。 –

+0

在句子中查找數字的問題是,您不知道點是句點還是浮點表示法。 – sln

回答

1

您可以使用單詞邊界與此正則表達式:

/(?:\.\d+|\b\d+(?:\.\d+)?)\b/g 

RegEx Demo

+0

「包含浮點數」:與「1.4e5」不匹配,浮點數錯誤且無間隔:https://regex101.com/r/9QEDH8/2 –

+0

而且您還可以包含帶符號的數字,例如'-1.23'不匹配。如果OP有任何這些要求,我一定可以解決它。 – anubhava

+1

[:[+ - ]?(?:\。\ d + | \ b \ d +(?:\。\ d +)?)(?:e \ d +)?\ b'](https://regex101.com/r/9QEDH8/3)應該適用於這些情況。 – anubhava

0

對於一個簡單的,而不是全面的解決方案(假設在給定的例子字符串中使用的數字類型,沒有負數,科學記數法等),試試這個:

\d*\.*\d+ 

它刪除\s你開發的正則表達式,與前面的空間相匹配。

\d*將匹配所有數字(數字[0-9])。

添加\.*\d+將匹配浮點數(小數後跟數字[0-9])。

0

這不是一個正則表達式,只能回答,但也許這是一件好事,我們拭目以待。

在這裏使用正則表達式是/^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/

var testStr = '.1 this is a1 my test +5 1a 12 string -2.4 12.123 whatever . .02e1 5e5.4 1 1.4e5 1.2.3'; 
 

 
console.log('matches'); 
 
console.log(...testStr 
 
    .trim() 
 
    .split(/\s+/g) 
 
    .filter(word => /^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/ 
 
    .test(word) 
 
) 
 
); 
 

 
console.log('mismatches'); 
 
console.log(...testStr 
 
    .trim() 
 
    .split(/\s+/g) 
 
    .filter(word => !/^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/ 
 
    .test(word) 
 
) 
 
);

0

試試這個表達式:(?<=^|\s)[-+]?(?:[0-9]*\.[0-9]+|[0-9]+)(?=$|\s) - 支持Regex demo

的JavaScript:(?:^|\s)([-+]?(?:[0-9]*\.[0-9]+|[0-9]+))(?=$|\s) - Regex demo

這種表達蘇帶有可選標記的浮點數。

JS不支持積極lookbehind,所以它被替換爲非捕獲組。這些數字由第一組捕獲。

相關問題