【问题标题】:How to use RegEx to ignore the first period and match all subsequent periods?如何使用 RegEx 忽略第一个期间并匹配所有后续期间?
【发布时间】:2017-06-14 16:46:31
【问题描述】:

如何使用RegEx忽略第一个句点并匹配所有后续句点?

例如:

  • 1.23(不匹配)
  • 1.23.45(匹配第二个周期)
  • 1.23.45.56(匹配第二个和第三个句点)

我试图限制用户输入无效号码。所以我将使用这个 RegEx 将匹配项替换为空字符串。

我目前有/[^.0-9]+/,但在(可选)初始. 之后禁止. 是不够的

【问题讨论】:

  • 您使用哪种正则表达式/语言?将其添加为标签。
  • /[^.0-9]+/中的.不需要转义,所以应该是/[^\.0-9]+/
  • .replace(/^(\d+\.)([\d.]*)$/, function($0,$1,$2) { return $1+$2.replace(/\./g, ''); })。也许第一个点应该是可选的?
  • @WiktorStribiżew 谢谢!这解决了问题并获得了我正在寻找的行为!如果不将第一个时期设为可选,现在会有什么影响?
  • 好的,我现在就发布答案。

标签: javascript regex number-formatting


【解决方案1】:

限制开始^ 和结束锚$ 之间的数字,然后指定您需要的数字模式。如:

/^\d+\.?\d+?$/

允许 1 个或多个数字,后跟一个可选的句点,然后是可选的数字。

【讨论】:

  • 这可以匹配我最终想要得到的数字。但我希望能够匹配非数字和非第一个句点,以便我可以用空字符串替换它们
【解决方案2】:

我建议使用一个正则表达式来匹配 1 个以上的数字、一个句点,然后是任意数量的数字和句点,将这 2 个部分捕获到不同的组中。然后,在替换回调方法中,删除所有句点,并附加一个replace

var ss = ['1.23', '1.23.45', '1.23.45.56'];
var rx  = /^(\d+\.)([\d.]*)$/;
for (var s of ss) {
  var res = s.replace(rx, function($0,$1,$2) { 
     return $1+$2.replace(/\./g, ''); 
  });
  console.log(s, "=>", res);
}

模式详情

  • ^ - 字符串开头
  • (\d+\.) - 组 1 匹配 1+ 数字和文字 .
  • ([\d.]*) - 除数字和文字点以外的零个或多个字符
  • $ - 字符串结束。

【讨论】:

  • 谢谢。这正是我所需要的!
  • 我意识到这种模式不会捕获额外的 '.'如果数字有前导“。”例如:.9422....123 将被允许
  • @Itsai:所以,问题是一个数字可能以. 开头?只需将第一个 + 替换为 * 即可匹配 0 次或多次出现:var rx = /^(\d*\.)([\d.]*)$/;。它解决了问题吗?
  • (刚刚有机会尝试一下。)将第一个 + 替换为 * 并不能解决问题。你是对的,我的例子中的一个数字可以以.开头当前模式允许输入多个.,只要我们以.开头
  • @Itsai:如果你需要从.9422....123中得到.9422123,上面的建议should work
猜你喜欢
  • 2020-06-16
  • 2016-03-15
  • 1970-01-01
  • 2015-03-10
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
相关资源
最近更新 更多