首页 > 解决方案 > 在正则表达式匹配方面需要帮助

问题描述

这可能非常简单,但我对正则表达式非常陌生,并且有一个要求,我需要在字符串中进行一些正则表达式匹配并提取其中的数字。下面是我的代码,带有示例 i/p 和所需的 o/p。我试图Pattern通过参考https://www.freeformatter.com/java-regex-tester.html来构建,但我的正则表达式匹配本身返回错误。

Pattern pattern = Pattern.compile(".*/(a-b|c-d|e-f)/([0-9])+(#[0-9]?)");
String str = "foo/bar/Samsung-Galaxy/a-b/1"; // need to extract 1.
String str1 = "foo/bar/Samsung-Galaxy/c-d/1#P2";// need to extract 2.
String str2 = "foo.com/Samsung-Galaxy/9090/c-d/69"; // need to extract 69

System.out.println("result " + pattern.matcher(str).matches());
System.out.println("result " + pattern.matcher(str1).matches());
System.out.println("result " + pattern.matcher(str1).matches());

以上所有 SOP 都返回 false。我正在使用 java 8,有什么方法可以在单个语句中匹配模式,然后从字符串中提取数字。

如果有人能指出我如何调试/开发正则表达式,我会很棒。如果我的问题有什么不清楚的地方,请随时告诉我。

标签: javaregex

解决方案


您可以使用

Pattern pattern = Pattern.compile(".*/(?:a-b|c-d|e-f)/[^/]*?([0-9]+)");

查看正则表达式演示

当与 一起使用时matches(),上述模式不需要显式锚点,^并且$.

细节

  • .*- 除换行符以外的任何 0+ 个字符,尽可能多
  • /- 最右边/的后面是后续的子模式
  • (?:a-b|c-d|e-f)- 一个非捕获组,匹配内部的任何备选方案:a-bc-de-f
  • /- 一个/字符
  • [^/]*?- 以外的任何字符/,尽可能少
  • ([0-9]+)- 第 1 组:一位或多位数字。

Java演示

List<String> strs = Arrays.asList("foo/bar/Samsung-Galaxy/a-b/1","foo/bar/Samsung-Galaxy/c-d/1#P2","foo.com/Samsung-Galaxy/9090/c-d/69");
Pattern pattern = Pattern.compile(".*/(?:a-b|c-d|e-f)/[^/]*?([0-9]+)");
for (String s : strs) {
    Matcher m = pattern.matcher(s);
    if (m.matches()) {
        System.out.println(s + ": \"" + m.group(1) + "\"");
    }
}

使用添加了锚的相同正则表达式的替换方法:

List<String> strs = Arrays.asList("foo/bar/Samsung-Galaxy/a-b/1","foo/bar/Samsung-Galaxy/c-d/1#P2","foo.com/Samsung-Galaxy/9090/c-d/69");
String pattern = "^.*/(?:a-b|c-d|e-f)/[^/]*?([0-9]+)$";
for (String s : strs) {
    System.out.println(s + ": \"" + s.replaceFirst(pattern, "$1") + "\"");
}

查看另一个 Java 演示

输出:

foo/bar/Samsung-Galaxy/a-b/1: "1"
foo/bar/Samsung-Galaxy/c-d/1#P2: "2"
foo.com/Samsung-Galaxy/9090/c-d/69: "69"

推荐阅读