首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex表达式不能正常工作。

问Regex表达式不能正常工作。
EN

Stack Overflow用户
提问于 2020-01-31 13:14:08
回答 4查看 102关注 0票数 1

我试图在字符串中找到数字格式为"4.97“的字符串,但如果数字小于1,则以.97、.80等格式表示。我希望在字符串中找到这类子字符串,并替换它们,以便它们以0开头。

它适用于字符串

代码语言:javascript
复制
String str = "Rate is : .97";

Result : "Rate is : 0.97"

但不适用于字符串:String str = "Rate is : .97 . XXXXXXXXX do you want . to perform another calculation . ";

代码语言:javascript
复制
    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");

为什么会发生这种事?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-01-31 14:32:12

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

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

代码语言:javascript
复制
(?<!\S)\.[0-9]

在替换中,使用0,然后是完全匹配。

Regex演示 x- Java演示

代码语言:javascript
复制
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"));

输出

代码语言:javascript
复制
Rate is : 0.97  . XXXXXXXXX do you want . 87 to perform another calculation . 

如果之前应该有非数字,则可以使用正向后查找。

代码语言:javascript
复制
(?<=\D)\.[0-9]

Regex演示

在Java中

代码语言:javascript
复制
String regex = "(?<=\\D)\\.[0-9]";
票数 0
EN

Stack Overflow用户

发布于 2020-01-31 13:21:15

看起来,您需要在regex中添加一些惰性匹配。

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

代码语言:javascript
复制
^(.*?\D)(.\d\d.*?)

您可以在这里看到这个正则表达式的工作原理,并给出更完整的解释。

我还添加了字符串匹配器的^开始,以确保它只创建了一次匹配,而不是重复到第二次。

票数 0
EN

Stack Overflow用户

发布于 2020-01-31 13:22:38

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

代码语言:javascript
复制
(\D)(\.\d+)

找到一个不是数字的字符,后面跟着一个点和至少一个数字。

其次,对于替换,您可以使用更低级别的特性,例如:

代码语言:javascript
复制
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);

但当然,这也适用于:

代码语言:javascript
复制
str = str.replaceAll("(\\D)(\\.\\d+)", "$10$2");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60004670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档