Java 正则表达式工作不正常

Java 正则表达式工作不正常,java,regex,string,Java,Regex,String,我试图在一个字符串中查找数字,其中数字的格式为“4.97”,但如果它们小于1,则格式为.97、.80等。我想在字符串中查找此类子字符串并替换它们,以便它们以0开头 它对弦起作用了 String str = "Rate is : .97"; Result : "Rate is : 0.97" 但不适用于字符串: String str=“速率为:.97.XXXXXXXXX。是否要执行其他计算。” 为什么会这样 看起来您需要在正则表达式中添加一些惰性匹配 ?意味着它将尝试尽可能少的匹配次数,在这种

我试图在一个字符串中查找数字,其中数字的格式为“4.97”,但如果它们小于1,则格式为.97、.80等。我想在字符串中查找此类子字符串并替换它们,以便它们以0开头

它对弦起作用了

String str = "Rate is : .97";

Result : "Rate is : 0.97"
但不适用于字符串:
String str=“速率为:.97.XXXXXXXXX。是否要执行其他计算。”


为什么会这样

看起来您需要在正则表达式中添加一些惰性匹配

意味着它将尝试尽可能少的匹配次数,在这种情况下,只选择第一个数字,而不选择第二个数字

^(.*?\D)(.\d\d.*?)


我还添加了字符串匹配器的开头,以确保它只创建了一个匹配项,而不会重复到第二个匹配项。

看起来您需要向正则表达式添加一些惰性匹配项

^(.*?\D)(.\d\d.*?)
意味着它将尝试尽可能少的匹配次数,在这种情况下,只选择第一个数字,而不选择第二个数字

^(.*?\D)(.\d\d.*?)


我还添加了字符串匹配器的开头,以确保它只创建了一个匹配项,而不会重复到第二个匹配项。

首先,您的正则表达式模式似乎是错误的。我想你可以用:

^(.*?\D)(.\d\d.*?)
(\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");

首先,您的正则表达式模式似乎是错误的。我想你可以用:

(\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");

你可以做一个积极的前瞻,这样你也可以捕捉到两者之间的空白。还有电话号码

(.(?=.\d)|(\d+))+
我会给你


然后,在代码中,您可以根据自己的意愿对组1(蓝色)和组2(红色)执行任何操作。

您可以执行正向前瞻,这样您也可以捕获组1和组2之间的空白。还有电话号码

(.(?=.\d)|(\d+))+
我会给你


然后,在您的代码中,您可以根据需要对组1(蓝色)和组2(红色)执行任何操作。

在第二个示例中,最后一个
\\d
后面的
*
将匹配除与字符串其余部分匹配的换行符之外的任何字符

您可以在没有捕获组的情况下使用负查找
(?来检查左侧的字符是否不是非空白字符)进行替换

(?<!\S)\.[0-9]

如果之前应该有一个非数字,您可以使用正向查找

(?<=\D)\.[0-9]

(?在第二个示例中,最后一个
\\d
后面的
*
将匹配除与字符串其余部分匹配的换行符之外的任何字符

您可以在没有捕获组的情况下使用负查找
(?来检查左侧的字符是否不是非空白字符)进行替换

(?<!\S)\.[0-9]

如果之前应该有一个非数字,您可以使用正向查找

(?<=\D)\.[0-9]
(?