2012-04-27 102 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