正则表达式匹配字符串末尾的数字

10

我想使用正则表达式匹配字符串末尾的数字。例如,字符串可能看起来像:

var foo = '101*99+123.12'; // would match 123.12
var bar = '101*99+-123';   // would match -123
var str = '101*99+-123.';  // would match -123.
这是我目前的代码,但如果没有小数点,它似乎会匹配整个字符串:
foo.match(/\-?\d+.?\d+?$/);

我理解为:

  • \-?:可选的“-”符号
  • \d+:1个或多个数字
  • .?:可选的小数点
  • \d+?:小数点后可选的1个或多个数字
  • $:匹配字符串末尾

我还漏掉了什么吗?


3
谢谢你实际尝试并展示了你的工作,并解释了它。如果有一个包含jsFiddle的话,可能会更好,但乞丐不能选择... :) 一个快速的提示 - 正则表达式中间的.意味着“任何字符”(基本上),而不是“句点”;我认为你应该转义它,写成\.?。这可能不是唯一的问题,只是我在你描述正则表达式时注意到的。 - Ian
1
哇...看看当提问者付出努力时,最简单的问题会得到很多赞。干杯! - jahroy
这个字符串看起来总是像 x*y+z 吗? - Xotic750
谢谢大家。我一直不太擅长正则表达式,但是我知道一些基础知识,所以我玩了一会儿。是的,字符串总是某种方程式。我正在寻找一种方法来提取最后一个完整数字。 - Phil
4个回答

5

. 匹配任何字符。你需要使用 \. 转义它。

试一下这个:

/-?\d+\.?\d*$/

即:

-?           // optional minus sign
\d+          // one or more digits
\.?          // optional .
\d*          // zero or more digits

正如您在MDN的正则表达式页面中所看到的,+?表示匹配1个或多个非贪婪字符,而不是可选的1个或多个字符的匹配。

哦,我没意识到我需要转义 .。我猜 +? 是指最后的数字匹配? - Phil
2
@Vitim.us - (如果你不是在开玩笑)他没有抄袭你的答案:他在你之前回答了问题,并且自那以后没有编辑过他的答案。根据评论,看起来他帮助修复了你的答案,所以我希望你只是在开玩笑。 - jahroy
@Phil,抱歉,当我谈到 +? 时,我试图解释为什么我没有在我的正则表达式中包含它(我使用了 _*_),以及为什么它在你的正则表达式中不起作用。但是没错,你确实将其用于最右边的数字。 - nnnnnn

0
如果模式始终为x*y+z,则您可以替代使用正则表达式进行如下操作。
var foo = '101*99+123.12'; // would match 123.12
var bar = '101*99+-123';   // would match -123
var str = '101*99+-123.';  // would match -123.

function getLastNumber(string) {
    return string.split("+")[1];
}

console.log(getLastNumber(foo));
console.log(getLastNumber(bar));
console.log(getLastNumber(str));

输出

123.12
-123
-123.

jsfiddle


0

几个问题:

  • 旁注:破折号不需要转义;它只在字符类中特殊(例如[a-z])。
  • 特殊的;它表示“匹配任何字符”。您需要转义它:\.
  • \d+?实际上意味着:至少匹配一个数字,但如果正则表达式在该模式的那部分之后继续进行,则尝试尽早地匹配剩余的正则表达式(“懒惰”或“非贪婪匹配”)。在您的情况下,这个什么也没做。要使这些数字真正可选,请使用\d*
  • 最后,您可能希望将小数点和随后的数字作为一组可选项:(\.\d+)?

执行摘要:/-?\d+(\.\d+)?$/


0

这个应该可以胜任 /-?\d+\.?\d*$/

result = subject.match(/-?\d+\.?\d*$/mg);

enter image description here enter image description here


这不会匹配帖子中带有尾数小数点的第三种情况。此外(根据他们的第一个示例),他们不想匹配“+”。 - nnnnnn
2
你用什么来分析正则表达式的呢? - MaxArt
@MaxArt 我使用RegexBuddy,它只能在Windows上运行,但是在Wineskin下的Mac OS X上也可以正常工作。 - Vitim.us

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接