无法理解Java中的Pattern Matcher示例

时间:2017-12-25 05:57:53

标签: java regex

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

字符串阈值为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?

5 个答案:

答案 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中看到它。