Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式截断尾随零_Java_Regex - Fatal编程技术网

Java 正则表达式截断尾随零

Java 正则表达式截断尾随零,java,regex,Java,Regex,我试图构造一个正则表达式(对于Java)来截断超过小数点的尾随零。e、 g 五万→ 五十 50.500→ 50.5 50.0500→ 50.05 -五,→ -五, 五十→ 五十 5.5→ 5.5 其思想是以尽可能紧凑的形式表示实数(或整数) 以下是我构建的: ^(-?[.0-9]+?)\.?0+$ 我正在使用$1捕获截断的数字字符串 上述模式的问题是50被截断为5。我需要某种方式来表示0+必须跟在后面(小数点)。 我尝试过使用negative behind,但无法获得任何匹配项。最好的解决

我试图构造一个正则表达式(对于Java)来截断超过小数点的尾随零。e、 g

  • 五万→ 五十
  • 50.500→ 50.5
  • 50.0500→ 50.05
  • -五,→ -五,
  • 五十→ 五十
  • 5.5→ 5.5
其思想是以尽可能紧凑的形式表示实数(或整数)

以下是我构建的:

^(-?[.0-9]+?)\.?0+$
我正在使用
$1
捕获截断的数字字符串

上述模式的问题是50被截断为5。我需要某种方式来表示
0+
必须跟在
后面(小数点)。

我尝试过使用negative behind,但无法获得任何匹配项。

最好的解决方案可能是为该任务使用内置的特定于语言的方法

如果您不能使用它们,您可以使用

^(-?\d+)(?:\.0+|(\.\d*?)0+|\.+)?$
并替换为
$1$2

看。相应地调整正则表达式。解释如下:

  • ^
    -字符串的开头
  • (?\d+)
    -第1组捕获1个或0个减号,然后捕获1个或多个数字
  • (?:\.0+\.\d*?)0+\.+)?
    -一个可选(由于后面的
    ,匹配1或0次)非捕获组匹配3个备选方案:
    • \.0+
      -小数点后加1+零
    • (\。\d*?)0+
      -第2组捕获具有任意0+位数但尽可能少且匹配1+零的点
    • \.+
      -(可选分支,如果不需要,您可以删除它)-匹配尾随点
  • $
    -字符串结束
:


对于一般正则表达式,它应该做到这一点:

^\d+-0*\??\d*?(?=0*?[^\d]*$)

您可以将插入符号和美元符号替换为任何边界。这些可以被你所期望的数字所取代

基本上:

/d+?
任何数字的非贪婪匹配(至少需要1个数字才能开始匹配)

\.**
十进制的可选匹配。首选匹配0个匹配项

\d*?(?=0*?[^\d]*$)
-数字的非贪婪匹配,但将在0处停止,该0由非数字进行


编辑:我刚刚意识到原始表达式还修剪了整数的最后一个零,这应该可以工作。我添加了选项0 match来捕获(\.0+)(\.0+)$如下所示:?您使用的是哪种语言?始终存在小数点吗?请注意,如果字符串以使用不同小数分隔符(或使用点字符作为分组分隔符)的格式表示数字,则所有正则表达式方法都将崩溃@WingPoon:如果输入是
-5
,你希望得到什么?它没有小数部分。就我所记得的,你需要删除小数部分的尾随零,或者你改变主意了,现在想匹配所有尾随零吗?你必须在问题中添加要求。使用。您使用的方法/代码是什么?
String s = "50.000\n50\n50.100\n50.040\n50.\n50.000\n50.500\n50\n-5";
System.out.println(s.replaceAll("(?m)^(-?\\d+)(?:\\.0+|(\\.\\d*?)0+|\\.+)?$", "$1$2"));
// => [50, 50, 50.1, 50.04, 50, 50, 50.5, 50, -5]