我试图在字符串中找到数字格式为"4.97“的字符串,但如果数字小于1,则以.97、.80等格式表示。我希望在字符串中找到这类子字符串,并替换它们,以便它们以0开头。
它适用于字符串
String str = "Rate is : .97";
Result : "Rate is : 0.97"但不适用于字符串:String str = "Rate is : .97 . XXXXXXXXX do you want . to perform another calculation . ";
String str = "Rate is : .97 . XXXXXXXXX do you want . 87 to perform another calculation . ";
String pattern = "(.*\\D)(.\\d\\d.*)";
System.out.println(str.matches("(.*\\D)(.\\d\\d.*)"));
str = str.replaceAll(pattern, "$10$2");为什么会发生这种事?
发布于 2020-01-31 14:32:12
在第二个示例中,上一个.*之后的\\d将匹配除换行符以外的任何字符,换行符将与字符串的其余部分匹配。
您可以在没有捕获组的情况下进行替换,使用负查找(?<!\S)检查左侧是否不是非空白字符。
(?<!\S)\.[0-9]在替换中,使用0,然后是完全匹配。
String str = "Rate is : .97 . XXXXXXXXX do you want . 87 to perform another calculation . ";
String pattern = "(?<!\\S)\\.[0-9]";
System.out.println(str.replaceAll(pattern, "0$0"));输出
Rate is : 0.97 . XXXXXXXXX do you want . 87 to perform another calculation . 如果之前应该有非数字,则可以使用正向后查找。
(?<=\D)\.[0-9]在Java中
String regex = "(?<=\\D)\\.[0-9]";发布于 2020-01-31 13:21:15
看起来,您需要在regex中添加一些惰性匹配。
?意味着它将尝试匹配尽可能少的次数,在这种情况下,它只是选择第一个号码,而不是进入第二个数字。
^(.*?\D)(.\d\d.*?)您可以在这里看到这个正则表达式的工作原理,并给出更完整的解释。
我还添加了字符串匹配器的^开始,以确保它只创建了一次匹配,而不是重复到第二次。
发布于 2020-01-31 13:22:38
首先,您的regex模式似乎是错误的。我想你可以用:
(\D)(\.\d+)找到一个不是数字的字符,后面跟着一个点和至少一个数字。
其次,对于替换,您可以使用更低级别的特性,例如:
String str = "Rate is : .97 . XXXXXXXXX do you want . 87 to perform another calculation . ";
final Pattern regex = Pattern.compile("(\\D)(\\.\\d+)");
final Matcher m = regex.matcher(str);
if (m.find()) {
str = m.replaceFirst(m.group(1) + "0" + m.group(2));
}
System.out.println(str);但当然,这也适用于:
str = str.replaceAll("(\\D)(\\.\\d+)", "$10$2");https://stackoverflow.com/questions/60004670
复制相似问题