2012-04-27 97 views
1

我想匹配一個已知數字(浮點數或整數)與一個字符串並找到重複的數字。正則表達式:匹配已知數

像匹配22 「22.5 98 12 22 322」

怎麼可以與正則表達式做呢?

+0

在基於正則表達式,答案要知道,'.'字符具有特殊的含義。如果你傳入一個數字,比如'22.53',你需要跳過這個句點:'/ 22 \ .53 /' – 2012-04-27 14:56:14

+0

'22'如何與'+ 22.00'或'0'匹配'-.0' '和'+ 0'或'-.02'對'-0.0200'? – sln 2012-04-27 18:31:01

+0

@sln:匹配之前,數字已經轉換爲正確的( - 。0轉換爲0和+22.00轉換爲22)與parseFloat – HosseiN 2012-04-29 09:50:37

回答

2
str.match(/substr/g).length 

回報「海峽」,「SUBSTR」的出現次數。例如:

str = "22.5 98 12 22 322" 
num = str.match(/22/g).length 
alert(num) // 3 

如果你想匹配整數而不僅僅是子,確保該號碼由一個空格前面和後面:

str = "22.5 98 12 22 322" 
num = str.match(/(^|\s)22($|\s)/g).length 
alert(num) // 1 

另一種選擇,沒有正則表達式:

str = "22.5 98 12 22 322" 
num = str.split(" ").filter(function(item) { 
    return Number(item) === 22; 
}).length; 
+0

謝謝。你的第二個解決方案是我想要的。 – HosseiN 2012-04-27 15:29:21

3

嘗試使用這樣的:

if (numbers.indexOf("22") != -1) { 
    //The number 22 is in the String 
} 

這並不完全是一個正則表達式,但是當你不需要它爲什麼要使用它?

+0

我想知道重複 – HosseiN 2012-04-27 15:06:06

0

這裏是一個很好的工具,爲您探索正則表達式:) http://www.regular-expressions.info/javascriptexample.html

從網站上通過了上述:

function demoShowMatchClick() { 
    var re = new RegExp("(?:^|)+(22(?:$|))+"); 
    var m = re.exec("22.5 98 12 22 322"); 
    if (m == null) { 
    alert("No match"); 
    } else { 
    var s = "Match at position " + m.index + ":\n"; 
    for (i = 0; i < m.length; i++) { 
    s = s + m[i] + "\n"; 
    } 
    alert(s); 
} 
} 

這將給你所有的比賽,並要求在開始或結束時分離數字ng或空格。

+0

的數量它也匹配22.5的22。 – HosseiN 2012-04-27 14:57:43

+0

你說得對,該模式不需要空格,終止符等,只需匹配一個或多個22。 – tovare 2012-04-27 22:03:11

1

如果你的意思是你應該只找到相同的字符串中重複的數字,你可以使用這樣的事情:

var test_str = '22 34 55 45345 34 22 555'; 
var matches = test_str.match(/(\b[0-9]+\b)(?=.+\b\1\b)/g); 
// matches contains ["22", "34"], but not "55" 
0

Corrolating整數/從文本到正則表達式浮點數是
很棘手,因爲正則表達式沒有這樣的概念。

通過動態輸入,所有工作都以編程方式構建正則表達式。
本示例不包含科學記數法,但它可以。

僞代碼:

If the input matches this parse regex 
    /^ (?=.*\d)  // must be a digit in the input 
     ([+-]?)  // capt (1), optional +/- 
     [0]*   // suck up all leading 0's 
     (\d*)  // capt (2), optional digits, will start with [1-9] 
     ([.]?)  // capt (3), optional period 
     (\d*?)  // capt (4), non-greedy optional digits, will start with [1-9] 
     [0]*   // suck up all trailing 0's 
    $/x 

    sign = '[+]?'; 

    If !length $2 AND !length $4 
     sign = '[+-]'; 
    Else 
     If $1 == '-' 
      sign = '[-]'; 
     Endif 
    Endif 

    whole = '[0]*'; 

    If length $2 
     whole = '[0]*' + $2; 
    Endif 

    decfrac = '[.]? [0]*'; 

    If length $4 
     $decfrac = '[.] ' + $4 + '[0]*'; 
    Endif 

    regex = '/(?:^|\s)(?=\S*\d) ' + "$sign $whole $decfrac" + ' (?:\s|$)/x'; 

Else 
    // input is not valid 
Endif 

這是一個Perl測試用例。
生成的動態正則表達式還沒有經過測試,
我認爲它有效,但我可能是錯的。

@samps = (
'00000.0', 
'+.0', 
'-.0', 
'0.', 
'-0.00100', 
'1', 
'+.1', 
'+43.0910', 
'22', 
'33.e19', 
); 


for (@samps) 
{ 
    print "\nInput: $_\n"; 

    if(/^ (?=.*\d) ([+-]?) [0]*(\d*) ([.]?) (\d*?)[0]*$/x) # 1,2,3,4 
    { 

     my ($sign, $whole, $decfrac); 

     $sign = '[+]?'; 

     if (!length $2 && !length $4) { 
      $sign = '[+-]'; 
     } elsif ($1 eq '-') { 
      $sign = '[-]'; 
     } 

     $whole = '[0]*'; 

     if (length $2) { 
      $whole = '[0]*'.$2; 
     } 

     $decfrac = '[.]? [0]*'; 

     if (length $4) { 
      $decfrac = '[.] '.$4.'[0]*'; 
     } 


     my $regex = '/(?:^|\s)(?=\S*\d) '. "$sign $whole $decfrac" . ' (?:\s|$)/x'; 

     print "Regex: $regex\n"; 
    } 
    else { 
     print "**input '$_' is not valid\n"; 
     next; 
    } 
} 

輸出

Input: 00000.0 
Regex: /(?:^|\s)(?=\S*\d) [+-] [0]* [.]? [0]* (?:\s|$)/x 

Input: +.0 
Regex: /(?:^|\s)(?=\S*\d) [+-] [0]* [.]? [0]* (?:\s|$)/x 

Input: -.0 
Regex: /(?:^|\s)(?=\S*\d) [+-] [0]* [.]? [0]* (?:\s|$)/x 

Input: 0. 
Regex: /(?:^|\s)(?=\S*\d) [+-] [0]* [.]? [0]* (?:\s|$)/x 

Input: -0.00100 
Regex: /(?:^|\s)(?=\S*\d) [-] [0]* [.] 001[0]* (?:\s|$)/x 

Input: 1 
Regex: /(?:^|\s)(?=\S*\d) [+]? [0]*1 [.]? [0]* (?:\s|$)/x 

Input: +.1 
Regex: /(?:^|\s)(?=\S*\d) [+]? [0]* [.] 1[0]* (?:\s|$)/x 

Input: +43.0910 
Regex: /(?:^|\s)(?=\S*\d) [+]? [0]*43 [.] 091[0]* (?:\s|$)/x 

Input: 22 
Regex: /(?:^|\s)(?=\S*\d) [+]? [0]*22 [.]? [0]* (?:\s|$)/x 

Input: 33.e19 
**input '33.e19' is not valid