这个 Java 正则表达式代码在做什么



我刚刚在我们的代码库中的"Utils"类型类中找到了此方法。它是很久以前由不再为我们工作的开发人员编写的。它在做什么?它返回的是什么?!?当然,没有JavaDocs或注释。

public static String stripChars(String toChar, String ptn){
    String stripped = "";
    stripped = toChar.replaceAll(ptn, "$1");
    return stripped.trim();
}

提前感谢!

本质上,这是一个非常短的别名。这:

stripChars(a, b)

相当于:

a.replaceAll(b, "$1").trim()

它似乎将"toChar"中与正则表达式"ptn"匹配的所有内容替换为"toChar"中匹配的第一组

正则表达式具有组的概念,例如匹配"2012 年"并将其替换为"1012 年",或将"2006 年"替换为"1007 年"(将前 20 更改为 10)可以通过替换来完成

"year 20([

0-9][9-9])"与"year 20$1"——也就是说,匹配整个字符串,然后将其替换为"year 20",后跟第一组($1)。 组是括号中的第一件事。

无论如何,您的方法会将与"toChar"中的"ptn"匹配的所有内容替换为正则表达式"ptn"中的第一组。 所以给定条字符("2012年","20年([0-9][9-9]"); 您只会收到"12",因为整个文本将匹配并仅由第一组替换。

然后,它会触发任何前导或尾随空格。

作为参数方法传递的模式字符串似乎包含一个匹配的组,并且替换所有调用将用与第一个组匹配的部分替换与 paatern 的整个匹配项。您应该查找此方法的调用层次结构,以查找传递给该方法的一些正则表达式以及正在处理的字符串,

只是replacing一个字符串,其中包含自己的匹配字符subset,然后从两端修剪空格。

佛的例子

因此,如果您希望将一个单词替换为该单词的一系列数字

使用正则表达式b.*?(d*).*?b

然后繁荣,你的replaceAll方法会给出这些结果

hey123wow->123
what666->666
how888->888

$0是指整个匹配的字符串,即hey123wowwhat666how888

$1指的是组,即(d*)在这个例子中,即123666888

$2将引用此示例中不存在的第二组。

toChar.replaceAll(ptn, "$1");

它用捕获的组替换了toCharptn的所有发生$1我们不知道它在哪里。

捕获组是brackets ()内的模式:-

例如,在下面的正则表达式中:-

"(\d+)(cd)"

  • $0表示完全匹配
  • $1表示第一个捕获组 ( \d+
  • $2表示第二个捕获组 ( cd

    String str1 = "xyz12cd";
    // This will replace `12cd` with the first capture group `12`
    str1 = str1.replaceAll("(\d+)(cd)", "$1"); 
    System.out.println(str1);
    

要了解有关Regular Expression的更多信息,您可以参考以下链接:-

  • http://www.vogella.com/articles/JavaRegularExpressions/article.html
  • http://docs.oracle.com/javase/tutorial/essential/regex/

最新更新