有人可以简化模式中的以下行: 下面这段代码正在删除尾随的零,但我无法理解它。
字符串阈值为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不能取代299.00?如果我想这样做,我可以做些什么来容纳299.0和299.00?
答案 0 :(得分:1)
$ 1,$ 2 ... $ n是对括号中包含的匹配的引用。 $ 0将是整场比赛,$ 1将是第一个括号内捕获,$ 2将是第二个,依此类推..
INSERT OVERWRITE TABLE pd_partition partition(name) SELECT id, count, name from pd_withoutpartition;
它将删除任意数量的尾随零。
答案 1 :(得分:1)
$2
与使用第二个numbered replacement backreference捕获的值相距capturing group。
您的模式匹配:
([\.,]0)
- 第1组(替换模式中引用$1
)匹配.
或,
,然后匹配单个0
字符($|\\s+)
- 第2组(来自替换模式的$2
)匹配字符串结尾($
)或1个或多个空白字符(\s+
)。如果您只在替换中使用$2
,则意味着丢弃第1组值,并且仅保留第2组值。
如果您使用lookaround(否定前瞻(?!\S)
),则可以避免在替换模式中使用反向引用:
public static String removeTrailingZeros(String threshold) {
return threshold.replaceFirst("[.,]0+(?!\\S)", "");
}
注意,您不需要在characterc类中转义.
。这里,[.,]0+(?!\S)
模式匹配:
[.,]
- character class匹配.
或,
0+
- 连续发生一次或多次0
(?!\S)
- 如果在当前位置右侧有一个除空格(\S
)之外的字符,则会导致匹配失败的否定前瞻。答案 2 :(得分:0)
($|\s+)
是对第二个捕获组的引用,在本例中为from t in Task
join p in Project
on t.ProjectId equals p.ProjectId
let subQ = ( from ug in UserGroup
join ptg in ProjectTypeGroup
on ug.GroupId equals ptg.GroupId
where ug.UserId == 1
select ptg.ProjectTypeId)
where subQ.Contains(p.ProjectTypeId)
select t
。效果是保留尾随空格(如果存在)。它似乎使用空格作为原始的,有点混乱的方式来检测字边界。
答案 3 :(得分:0)
简化将使用此代码
try catch
答案 4 :(得分:-1)
请参阅oracle doc进行分组并使用此代码:
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
您也可以在here中看到它。