正则表达式只保留字母空格和特定类型的小数

时间:2013-03-22 12:55:05

标签: java regex decimal

我试图将所有内容从字符串中删除,除了点之前的类型[0-9] {1,3}的字母,空格和小数,以及点之后的[0-9] {1,2}。

我在java中提出了这个问题

replaceAll("[^\\p{L}\\s(\\s[0-9]{1,3}(\\\\.[0-9]{1,2})?)]", "+"));

我真的无法让它发挥作用。当涉及正则表达式时,我是一个真正的新手。

示例

:mpla 12.5 mpla 121.22 mpla 1.52 mpla 1 mpla 1000 mpla 1000.12 mpla12.5

返回:mpla 12.5 mpla 121.22 mpla 1.52 mpla 1 mpla + mpla + +

//对mpla12.5特别谨慎这也不是因为我想要的格式 \ sNUMBER \ S

2 个答案:

答案 0 :(得分:3)

只是注意,正则表达式对于在字符类之外执行“not”语义并不是很好。所以,我建议专注于你想要保留的内容并从中构建你的结果:

String s = "mpla 12.5 mpla 121.22 mpla 1.52 mpla 1 mpla 1000 mpla 1000.12 mpla12.5";
Pattern p = Pattern.compile("[A-Za-z]+|\\s(\\d{1,3}(\\.\\d{1,2})?\\s)?");
Matcher m = p.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    sb.append(m.group());
}
System.out.println(sb.toString());

输出:

mpla 12.5 mpla 121.22 mpla 1.52 mpla  mpla  mpla  mpla

我认为这是您要求的最严格意义 - 请注意结果中有多个空格,如果需要,您将需要进行消毒。

修改:让我澄清一下regexes are not really good for doing "not" semantics outside of character classes的含义。如果你只想“匹配任何不是字母或空格的字符”,那么使用否定的字符类就很容易:[^A-Za-z\\s]。但是,一旦你开始需要否定多字符分组(例如\\d{1,3}\\.\\d{1,2}),它就会变得难看。你可以在技术上使用负向前瞻来做,但它很笨拙而且不是很直观。这篇文章解释得很好:https://stackoverflow.com/a/406408/1311394

编辑2 :根据您的评论,我相信使用String.split()和正则表达式匹配的解决方案可以更轻松地完成您的工作:

String s = "12.5 mpla 12.5 mpla 121.22 mpla 1.52 mpla 1 mpla 1000 mpla 1000.12 mpla12.5";
StringBuilder sb = new StringBuilder();
for (String token : s.split("\\s+")) {
    if (token.matches("[A-Za-z]+|\\d{1,3}(\\.\\d{1,2})?")) {
        sb.append(token).append(" ");
    }
}
System.out.println(sb.toString());

输出:

12.5 mpla 12.5 mpla 121.22 mpla 1.52 mpla 1 mpla mpla

这应该照顾评论中提到的案例。大多数情况下,一个非常复杂的正则表达式是代码气味,并且通常有一种更简单的方法来解决问题。

答案 1 :(得分:0)

试试这个:

        String data = "ds#@234f&^%%sd232.ertre3df6g#@$566";
    String replaceString = data.replaceAll("[^\\w\\s\\.]", "");

    System.out.println(data);

    String firstPart = replaceString.split("\\.")[0];

    String secondString = "."+ replaceString.split("\\.")[1];


    String finalString = firstPart + secondString.replaceAll("[^\\d\\.]", "");
    System.out.println(finalString);