Java String replaceAll regex删除除数字,点和空格之外的所有内容

时间:2016-12-04 09:19:20

标签: java regex string

我浏览了很多正则表达式主题,但这些都没有让我在特定情况下取得成功。

(使用java)我有一些charsequence然后我转换为数组并将数字提取到双精度数组。

  

asdsad 59 asdf .2 asdf 56 89 .a 2.4 wef 95 asdf。

然后我想使用正则表达式删除额外的部分并组成以下字符串

  

59 2 56 89 2.4 95

所以我可以使用.split(" ")并将它们全部放到双打数组中。

直到这一刻我才使用以下表达式

[^0-9.\s]

但它留下了额外的点,因此不可靠。现在我正在尝试像

这样的东西
[^0-9.\s]|([^0-9]\.[^0-9])

但它根本不起作用,我对正则表达式并不是很好,所以你能解释一下为什么最后一个表达式不起作用以及如何修复它。

2 个答案:

答案 0 :(得分:1)

添加一个替代方法,删除前面没有数字的点,后跟一个点和一个数字:

[^\d\s.]+|(?<!\d\.\d)\.

请参阅此regex demo

<强>详情:

  • [^\d\s.]+ - 除了数字,空格和点之外的1个字符
  • | - 或
  • (?<!\d\.\d) - 一个前面没有数字,点,数字的位置
  • \. - 一个点。

示例代码:

String re = "[^\\d\\s.]+|(?<!\\d\\.\\d)\\.";
System.out.println("asdsad 59 asdf 2 asdf 56 89 .a 2.4 wef 95 asdf.".replaceAll(re, ""));
System.out.println("asdsad 59 asdf .2 asdf 56 89 .a 2.4 wef 95 asdf.".replaceAll(re, ""));

Java demo

答案 1 :(得分:1)

我用正则表达式玩了半天,直到我想出来。

显然,表达的顺序真的很重要。我假设这是因为它遍历每个条件并始终使用执行先前条件后剩下的数据,因此我将正则表达式更改为:

  1. 排除所有,然后排除非数字

  2. 排除所有非数字,然后排除

  3. 排除所有遗留下来的非数字

  4. [^0-9]\.|\.[^0-9]|[^0-9.\s]
    

    现在它就像一个魅力。希望它可以帮助某人。 :)