Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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,有没有人可以简化以下行的模式: 下面的代码正在删除尾随的零,但我无法理解它 字符串阈值为299.0,输出为299 public static String removeTrailingZeros(String threshold) { Pattern thresholdPattern = Pattern.compile("([\\.,]0)($|\\s+)"); Matcher match = thresholdPattern.matcher(threshold); th

有没有人可以简化以下行的模式: 下面的代码正在删除尾随的零,但我无法理解它

字符串阈值为299.0,输出为299

public static String removeTrailingZeros(String threshold) {
    Pattern thresholdPattern = Pattern.compile("([\\.,]0)($|\\s+)");
    Matcher match = thresholdPattern.matcher(threshold);
    threshold = match.replaceFirst("$2");
    return threshold;
}
为什么我们要做“match.replaceFirst(“$2”);” 我无法理解它的意义


它是如何找到追踪的零点的


它不会将299.00替换为299?如果我想这样做,我能做些什么来容纳299.0和299.00

1美元,2美元$正则表达式中的n是对括号中的匹配项的引用$0将是整个匹配,$1将是第一个括号中的捕获,$2将是第二个,依此类推

 Pattern thresholdPattern = Pattern.compile("([\\.,]0*)($|\\s+)");

它将删除任意数量的尾随零。

$2
是对第二个捕获组的引用,在本例中为
($\s+
)。其效果是保留尾随空格(如果存在)。它似乎使用空白作为一种基本的、有点混乱的方式来检测单词边界。

有关分组和使用此代码的信息,请参阅:

inputStr.replaceFirst("^(\\d+)(((!?)[\\.,])([0]*))(\\$|\\s*)$", "$1$6");
输入字符串示例:

"299." & "299.00" & "299.000" & ... change to  => "299"

"299.$" & "299.00$" & "299.000$" & ... change to  => "299$"

"299.001" & "299.010" & "299.0001$" & ... not change
您也可以在中看到它。

$2
是与第二个捕获的值的比较

您的模式匹配:

  • ([\,]0)
    -第1组(在替换模式中以
    $1
    引用)匹配
    然后匹配单个
    0
    字符
  • ($|\\s+
    -组2(在替换模式中用
    $2
    引用)匹配字符串结尾(
    $
    )或一个或多个空格字符(
    \s+
如果在替换中仅使用
$2
,则表示放弃组1的值,只保留组2的值

如果使用(负前瞻
(?!\S)
),则可以避免在替换模式中使用反向引用:

注意:您不需要在characterc类中转义
。这里,
[,]0+(?!\S)
模式匹配:

  • [,]
    -匹配的
  • 0+
    -1次或多次连续出现
    0
  • (?!\S)
    -如果当前位置右侧有除空格以外的字符(
    \S
    ),则会导致匹配失败的负前瞻

    • 要简化,将使用此代码

      String example = "299.00";
      example = example.replaceAll("\\\\.0+", "");
      

      它是如何找到跟踪零点的?它不会用299代替299.00?如果我想这样做,我能做些什么来容纳299.0和299.00呢?@Naresh我已经根据你的问题编辑了答案。1。你能解释一下这个“([\\,]0”正则表达式吗?我知道你放了“*”,2。对于像:200.003?200.03?200.30?@Naresh 1这样的数字,这可能是个问题吗?[\\,]将匹配“.”之后的字符,[\\,]0它确保“.”之后只有0应该匹配。2.它将适用于每个输入。
      String example = "299.00";
      example = example.replaceAll("\\\\.0+", "");