无法理解Java中的模式匹配器示例
有没有人可以简化以下行的模式: 下面的代码正在删除尾随的零,但我无法理解它 字符串阈值为299.0,输出为299无法理解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
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
是与第二个捕获的值的比较
您的模式匹配:
-第1组(在替换模式中以([\,]0)
引用)匹配$1
或
然后匹配单个,
字符0
-组2(在替换模式中用($|\\s+
引用)匹配字符串结尾($2
)或一个或多个空格字符($
)\s+
$2
,则表示放弃组1的值,只保留组2的值
如果使用(负前瞻(?!\S)
),则可以避免在替换模式中使用反向引用:
注意:您不需要在characterc类中转义
。这里,[,]0+(?!\S)
模式匹配:
-匹配的[,]
或,
-1次或多次连续出现0+
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+", "");