【问题标题】:Java Regex - remove non-numeric charactersJava Regex - 删除非数字字符
【发布时间】:2021-03-27 17:49:04
【问题描述】:

我是 Regex 的新手,我正在尝试使用 Java 的 Regex 从字符串中删除非数字字符。

字符串可以在数字之后有字母,并且空格可以出现在数字之前、数字和字母之间以及字母之后。

例如,一个有效的字符串可以是" -23 asdf"

我编写了以下正则表达式:"(\\s*)[^-?][^0-9][\\s*a-zA-Z.\\s*]",并且我正在使用 replaceAll 方法去除非数字字符 replaceAll(regex, "")

我的想法是\\s* 匹配零次或多次空格字符
[^-?] 保留可选的减号
[^0-9] 保留数字字符
[\\s*a-zA-Z.\\s*] 匹配之前的空格和任何字母字符之后。\

但是,当我尝试使用输入 " -23 asdf" 运行此代码时,我得到了 -2 的意外结果

我做错了什么?

【问题讨论】:

  • stackoverflow.com/questions/10372862/… 应该可以帮到你。
  • 我觉得[^0-9]只保留一个字符,需要加+
  • [^-?] 不正确。你想要-? 没有任何括号。 ? 出现在方括号内时不是特殊字符。括号表示数字前面必须有一个字符,既不是连字符也不是问号。

标签: java regex


【解决方案1】:

这是一种可行的方法:

String input = "hello world -23 as-df blah blah blah";
String output = input.replaceAll("[^\\d-]|-(?=\\D)", "");
System.out.println(output);

打印出来:

-23

这里使用的正则表达式表示匹配:

[^\\d-]   any non numeric character EXCEPT for dash (i.e. spare -)
|         OR
-(?=\\D)  remove dash if NOT followed by a number

也就是说,如果破折号不是负数的一部分,我们会去掉它。替换为空字符串,以删除这些不需要的内容。

【讨论】:

  • 请问-(?=\\D)中的等号在这里有什么作用?同样对于括号,我认为这意味着分组?在这种情况下是真的吗?谢谢!
  • @user101998 (?=\\D) 表示向前看并断言后面的内容不是数字。那是匹配- 只有当它 not 一个负号后跟一些数字。
猜你喜欢
  • 2017-10-16
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多