匹配不同格式的数字

时间:2017-11-02 05:35:50

标签: javascript regex numbers separator

  • 我有一个用英文写的匹配号码的正则表达式:
    [1-9]\d{0,2}(,\d{1,3})+(\.\d+)?
    例如,buy a sport car 1,000,000.25将匹配此正则表达式。
  • 我也有一个正则表达式匹配用我的语言编写的数字(越南语 - 基本上,.符号交换了)
    [1-9]\d{0,2}(\.\d{1,3})+(,\d+)?
    例如,buy a sport car 1.000.000,25将匹配此正则表达式 这就是我要的:
    1. 如果数字与英国数字正则表达式匹配,则不应与越南数字正则表达式相匹配。但是,在这种复杂的情况下:buy a house 1.234.532.727,94 in October它匹配两个正则表达式。
    2. 鉴于英语正则表达式的情况,我目前的英语正则表达不能与此字符串匹配:2.45 buy a song
    3. 从此字符串:buy a house 1.234.532.727,94 in October,如何提取此字符串:1.234.532.727,94

我应该如何纠正我的正则表达式以获得我想要的东西?

3 个答案:

答案 0 :(得分:1)

对于问题的第二部分,要使英语区域设置正则表达式匹配2.45,您只需将逗号用语(,\d{1,3})设为可选:

[1-9]\d{0,2}(,\d{1,3})*(\.\d+)?
                     ^^^ change + to *

对于您的第一个问题,我认为您的单独的正则表达式已经正确地过滤掉了英语或越南语语言环境,q.v。以下两个演示。我唯一需要做的就是添加锚点^$

English

Vietnamese

<强>更新

如果要从以下句子中提取英语区域设置编号:

buy books 12.45 at school

然后你可以试试这段代码:

var regex = /.*(?:\s+|^)([1-9]\d{0,2}(?:,\d{1,3})*(?:\.\d+)?)(?:\s+|$).*/g;
var matches = regex.exec("buy books 12.45 at school");
console.log(matches[1]);

Demo

答案 1 :(得分:1)

  

如果一个数字与英文编号正则表达式匹配,则它不应该匹配   越南号正则表达式

使用开始^并结束$两个正则表达式,所以

/^[1-9]\d{0,2}(,\d{1,3})+(\.\d+)?$/.test( "1.234.532.727,94" ) ; //false 
  

鉴于英国正则表达式的情况,我现在的英语正则表达不可能   匹配此字符串:2.45

这是因为(,\d{1,3})+需要至少出现一个3位数,所以(,\d{1,3})*

/^[1-9]\d{0,2}(,\d{1,3})*(\.\d+)?$/.test( "2.45" ); //true

修改

正如@RobG在下面指出的那样,如果您想要处理0,000.1230.123等方案,请将初始[1-9]\d{0,2}替换为\d{1,3}

例如

/^\d{1,3}(,\d{1,3})*(\.\d+)?$/.test( "0,000.123" ); //true

/^\d{1,3}(,\d{1,3})*(\.\d+)?$/.test( "0.123" );  //true

修改2

如果必须是String的一部分,则在正则表达式周围加上字边界而不是开始和结束符号。

/\b\d{1,3}(,\d{1,3})*(\.\d+)?\b/.test( "asd 0,000.123 sad" ); //true

^$\b

取代

编辑3

使用此方法

&#13;
&#13;
var input = "buy a house 1.234.532.727,94";

var matches = input.split(" ").filter( function( item ) { return item.match( /(\d{1,3}(,\d{1,3})*(\.\d+)?)/g ) });

console.log( matches );
&#13;
&#13;
&#13;

答案 2 :(得分:1)

为此目的的最佳正则表达式将是

(?:^|\s)(\d{1,3}(?:,\d{3})*(?:\.\d+)?)(?!\S)

请参阅regex demo

(?:^|\s)匹配字符串的开头或数字前面的空格,(?!\S)匹配数字后面的whitepsace或字符串结尾,而不消耗它们。

JS演示:

var rx = /(?:^|\s)(\d{1,3}(?:,\d{3})*(?:\.\d+)?)(?!\S)/g;
var str = "buy a sport car 1,000,000.25 1.000.000,25 2,000,000.25 3,000,000.25 test 2.45 and reject test 2,45";
var res=[], m;

while (m = rx.exec(str)) {
    res.push(m[1]);
}
console.log(res);