如何使用正则表达式从字符串中去除字母、破折号和美元符号?

44

我正在尝试查找文本框中所有字母、破折号和美元符号,并将它们删除。

function numbersOnly()
{
    if ($('.sumit').val().indexOf([A-Za-z-$])) {
        $('.sumit').val().replace([A-Za-z-$], "");
    }
}

这就是我拥有的,而且我很确定它是错误的。我对正则表达式不太熟悉,但我正在尝试学习它们。有人想帮助我并开始完成这个函数吗?

那么..你已经有了输入。

<div class="numInputRight"><input type="text" class="sumit" name="sumAmount1"></div>
<div class="numInputRight"><input type="text" class="sumit" name="sumAmount2"></div>
<div class="numInputRight"><input type="text" class="sumit" name="sumAmount3"></div>

那么你现在有这个函数:

numbersOnly = function()
{
  $('.sumit').val().replace(/[A-Za-z$-]/g, "");
  alert($('.sumit').val());
  return false;
}   

我正在使用 alert 来确定替换是否起作用,但貌似没有。


说实话,这些都不起作用。我会告诉你我得到了什么。我也在尝试使用3个输入框来完成这个任务。 - Michael Stone
你应该将选择器从.subit更改为input.sumit - 性能会更好。 - Paolo Bergantino
6个回答

149

这应该可以解决问题。

$('.sumit').val().replace(/[^\d.]/g, "");
[^]是一个取反字符类,它将匹配所有不包含在字符类中的字符。
在这种情况下,我们的字符类是\d(即数字0-9)和一个句点(以允许小数)。我更喜欢这种方法,因为它会捕获任何非数字字符,而无需担心明确列出我不想要的非数字字符。
如果你真的只想排除字母、$和-,那么Sean的回答是更好的选择。

4
如果这种替换经常进行或者针对长字符串进行,那么在字符组后面加上一个 + 可能是值得的,这样当存在一系列的非数字字符时,模式就不必为每个字符执行一次替换。虽然在这种情况下我怀疑不会有任何显著的性能提升,但如果没有其他问题的话,这是一个好的习惯。=) - Blixt
4
我认为使用\D应该可以。 \D的大概定义是^\d。 - CoderTao
1
为什么在 [^\d.] 中需要 .?这不应该否定任何字符吗?它确实可以工作,但为什么? - Claudiu
1
“.”是为了允许带有小数点的数字。因此,字符类中的句点仅被视为句点,而不是正则表达式运算符。 - Mark Biek
在大多数正则表达式中,字符类(方括号 [ 和 ] 之间的任何内容)只需要转义 ], , ^ 和 - 这几个元字符,而不是通常的所有元字符选择:http://www.regular-expressions.info/charclass.html。@Claudiu - jilles de wit

27

Mark's这个方法适用于所有非数字字符。如果你只想去掉字母、破折号和$符号(但是保留小数点,例如),将这个修改添加到你的原始代码中:

$('.sumit').val().replace(/[A-Za-z$-]/g, "");
(我个人更喜欢马克的更新答案的原因与他相同;这样可以捕获所有无法预测的内容。)
对于你更新后的问题,值不会改变的原因是val()返回一个新字符串,它不会改变实际值。要实现这一点,请尝试:
$('.sumit').each(function() { 
    $(this).val($(this).val().replace(/[A-Za-z$-]/g, "")); 
});
alert($('.sumit').val());

我还将其转换为each()调用,以便每个元素都会单独完成。


这个可行!不过我仍然想能够看到每个单独输入框的警报。我只返回了第一个输入框的警报。虽然..使用.each(),它应该返回所有值。这没什么大不了的,我可以处理。谢谢。 - Michael Stone
@Michael:只需将此放入each函数中:alert($(this).val()); - Paolo Bergantino
这个正则表达式的更好写法是:/[A-Za-z$-.\/\\\[\]=_@!#^<>;"]/g - jnrcorp

7

我非常喜欢Mark的答案。但是,根据你使用的编程语言(和正则表达式引擎),\d会匹配像४或৮这样的字符,它们是UTF-8数字

因此,如果你只想要0到9之间的数字,请使用[^0-9.]

$('.sumit').val().replace(/[^0-9.]/g, "");

如果您的正则表达式引擎支持UTF-8,则速度会更快。适用于此的示例语言是Python3(http://docs.python.org/3/library/re.html - 搜索"\d")。然而,ECMA标准指出,在JavaScript中,\d等同于[0-9]

5
$('.sumit').val().replace(/\D/g, "");

替换所有非数字值为指定值。

1
这对我有用:

$('.sumit').val().replace(/[^\d]/g, "");

我尝试了Mike的答案,使用大写的\D代替先否定\d,但由于某些原因,这种方法没有去除括号和其他标点符号。否定\d则完美解决问题。

如果你想保留小数,可以在方括号中加入点和其他符号。

PS 我测试的环境是Titanium SDK。


0

可以尝试这样做:

function numbersOnly()
{
    $('.sumit').val().replace(/[\w-$]/g, "");
}

1
实际上,在JavaScript中,\w代表[a-zA-Z0-9_],因此您可能不想使用它。 - Sean

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