如何去除字符串中除第一个字符以外的所有非数字字符?

4

我有一个字符串,希望它的格式始终为一个加号后跟着数字。
以下内容可以实现:

String parsed = inputString.replaceAll("[^0-9]+", "");  
if(inputString.charAt(0) == '+') {  
   result = "+" + parsed;  
}  
else {
  result = parsed;  
}  

有没有一种方法,在replaceAll中使用正则表达式来保留字符串开头的+(如果存在),并替换第一行中的所有非数字字符?

NB: replaceAll 不会在没有加号的情况下添加加号,所以我不知道你在寻找什么。 - user180100
这个正则表达式应该可以工作,我相信:搜索 (^[+])|[^0-9]+ 并替换为 $1 - Wiktor Stribiżew
从你的代码来看,似乎允许输入如 abd+3G45;{ 这样的内容,这对我来说不太合理。你可能想要断言输入与某种模式 [+]?\s*\d+\s* 匹配(白名单)。 - nhahtdh
5个回答

3
以下给定的正则表达式可以完成这项工作:
String result = inputString.replaceAll("(^\\+)|[^0-9]", "$1");

(^\\+)    find either a plus sign at the beginning of string and put it to a group ($1),
|         or
[^0-9]    find a character which is not a number
$1        and replace it with nothing or the plus sign at the start of group ($1)

输入如 +345HHHH 时,+ 被丢失了。 - nhahtdh
@nhahtdh 感谢您找出了问题所在。我通过将 ?(零或一)替换为 |(或)来更改正则表达式。现在它正确地输出了 +345 - bobbel

2
您可以使用以下表达式:
String r = s.replaceAll("((?<!^)[^0-9]|^[^0-9+])", "");

这个想法是替换任何非数字字符,当它不是字符串的初始字符时(使用后顾引用的部分是(?<!^)[^0-9]),或者任何不是数字或加号的字符作为字符串的初始字符(^[^0-9+] 部分)。

演示。


但是字符串的唯一可接受的非数字初始字符是 +。这个正则表达式允许任何非字符,对吧? - Jim
相当于 .replaceAll("(^\\+)?[^0-9]+", "$1"),对吧? - user180100
@Jim 不行,只允许使用加号 +。请看演示。其中一个输入字符串是 "a56b78",它会变成 5678 - Sergey Kalinichenko
@dasblinkenlight:+ 是如何加强的?我不确定表达式的哪个部分保留了 + - Jim
@Jim [^0-9+] 允许加号(请注意它在括号的另一侧)。你试过了吗?如果你找到反例,请告诉我。 - Sergey Kalinichenko

2
仅仅是这样呢?
(?!^)\D+

Java字符串:

"(?!^)\\D+"

在regex101.com上的演示

  • \D 匹配非数字字符 [^0-9]

  • (?!^) 使用负向前瞻,检查是否不是初始字符


0

是的,您可以使用这种替换方法:

String parsed = inputString.replaceAll("^[^0-9+]*(\\+)|[^0-9]+", "$1");

如果字符串中存在且在第一个数字之前,+ 字符将被捕获到第一组中。例如:dfd+sdfd12+sdf12 返回 +1212(第二个 + 被移除,因为它的位置在第一个数字后面)。


0

请尝试这个

1- 这将允许负数和正数,并匹配应用程序中除了在第一个位置的-和+之外的特殊字符。

(?!^[-+])[^0-9.]

2- 如果你只想允许 + 出现在第一个位置

(?!^[+])[^0-9.]

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