Java 正则表达式工作不正常
我试图在一个字符串中查找数字,其中数字的格式为“4.97”,但如果它们小于1,则格式为.97、.80等。我想在字符串中查找此类子字符串并替换它们,以便它们以0开头 它对弦起作用了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。是否要执行其他计算。” 为什么会这样 看起来您需要在正则表达式中添加一些惰性匹配 ?意味着它将尝试尽可能少的匹配次数,在这种
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]
(?