gpt4 book ai didi

java - 正则表达式只保留某些类型的字母空格和小数

转载 作者:行者123 更新时间:2023-12-04 05:05:22 25 4
gpt4 key购买 nike

我试图从字符串中抛出除点前 [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

最佳答案

请注意,正则表达式并不适合在字符类之外执行“非”语义。因此,我建议专注于您想要保留的内容并从中构建结果:

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

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

关于java - 正则表达式只保留某些类型的字母空格和小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15570875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com