我试图将所有内容从字符串中删除,除了点之前的类型[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
答案 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);