【问题标题】:Regular Expression. Find all int and replace with double正则表达式。查找所有 int 并替换为 double
【发布时间】:2016-10-07 09:21:30
【问题描述】:

我有一个带有类似数学公式的字符串

5+10/3-3.0 *(4+8.0)

我想将所有 int 值替换为 double

结果:

5.0+10.0/3.0-3.0 *(4.0+8.0)

我可以使用 ([\d]*)\.([\d]*) 找到双精度值,但我想找到所有不属于双精度值的 ([\d]*)

【问题讨论】:

标签: regex


【解决方案1】:

您可以为此使用反向引用。所有整数都应该由数字组成,并且不应以点开头并以点或其他数字为后缀(因为我们宁愿将所有数字符号一起捕获)。 C# 风格示例:

(?<!\.)(\d+)(?![\.\d])

【讨论】:

  • 这个正则表达式兼容的不仅仅是 .NET 风格。但我仍然建议在开始时使用单词边界。或者也将\d 添加到lookbehind 中,或者a23 中的数字将匹配(在这种情况下可能不会,但在其他情况下可能会有所帮助)。
【解决方案2】:

由于我们不知道您使用的是哪种语言以及如何处理它,因此唯一可移植的大规模替换解决方案是执行两次。首先用\b(\d+)\b 运行一个,用1 + ".0" 替换第1 组,然后用\.0\. 运行第二次,用一个点替换它(第0 组)。虽然这个解决方案比较重,但它是最简单和最通用的。

要使用的不太便携的表达式是((\d+)(\.\d+)?),带有条件处理。这是一个 Java 示例:

java.util.regex.Pattern pc = java.util.regex.Pattern.compile("((\\d+)(\\.\\d+)?)");
java.util.regex.Matcher m = pc.matcher("5+10/3-3.0 *(4+8.0)");
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, m.group(3) == null ? m.group(1) + ".0" : m.group(1));
}
m.appendTail(sb);
System.out.println(sb.toString());

也可以在 PHP 中将此表达式与回调函数一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多