Java String REGEX 识别 DOI 的正确格式是什么

Whats the correct format of Java String REGEX to identify DOI

我正在进行一些关于在自由格式文本中识别 DOI 的研究。

我正在使用 Java 8 和 REGEX

我有 found 这些 REGEX 可以满足我的要求

/^10.\d{4,9}/[-._;()/:A-Z0-9]+$/i
/^10.1002/[^\s]+$/i
/^10.\d{4}/\d+-\d+X?(\d+)\d+<[\d\w]+:[\d\w]*>\d+.\d+.\w+;\d$/i
/^10.1021/\w\w\d++$/i
/^10.1207/[\w\d]+\&\d+_\d+$/i

我正在尝试的代码是

private static final Pattern pattern_one = Pattern.compile("/^10.\d{4,9}/[-._;()/:A-Z0-9]+$/i", Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern_one.matcher("http://journals.ametsoc.org/doi/full/10.1175/JPO3002.1");
while (matcher.find()) {
                System.out.print("Start index: " + matcher.start());
                System.out.print(" End index: " + matcher.end() + " ");
                System.out.println(matcher.group());
        }

但是匹配器没有找到任何东西。

我哪里做错了?

更新

我遇到了我的 REGEX 集不匹配的有效 DOI

这是一个 DOI 示例:10.1175/1520-0485(2002)032<0870:CT>2.0.CO;2

为什么这个模式不起作用?

/^10.\d{4}/\d+-\d+X?(\d+)\d+<[\d\w]+:[\d\w]*>\d+.\d+.\w+;\d$/i

我觉得你的模式不正确。您目前正在使用:

/^10.\d{4,9}/[-._;()/:A-Z0-9]+$/i

但我认为你打算使用这个:

^.*/10\.\d{4,9}/[-._;()/:A-Z0-9]+$

您的模式存在的问题包括您使用的是 JavaScript 正则表达式语法或其他语言的语法。此外,您没有转义正则表达式中的文字点,并且模式标记的开头不合适。

代码:

String pattern = "^.*/10\.\d{4,9}/[-._;()/:A-Z0-9]+$";
String url = "http://journals.ametsoc.org/doi/full/10.1175/JPO3002.1";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(url);
if (m.find( )) {
    System.out.println("Found value: " + m.group(0) );
} else {
    System.out.println("NO MATCH");
}

此处演示:

Rextester

在Java中,正则表达式被写成字符串。在其他语言中,正则表达式使用 /.../ 引用,并在结尾 / 之后给出 i 等选项。所以,写成 /XXX/i 的东西在 Java 中会这样写:

// Using flags parameter
Pattern p = Pattern.compile("XXX", Pattern.CASE_INSENSITIVE);

// Using embedded flags
Pattern p = Pattern.compile("(?i)XXX");

在大多数语言中,正则表达式用于查找匹配的子字符串。 Java 也可以做到这一点,使用 find() method (or any of the many replaceXxx() regex methods), however Java also has the matches() 方法匹配整个字符串,不再需要开始和结束边界匹配器 ^$.

无论如何,您的问题是正则表达式同时具有 ^$ 边界匹配器,这意味着它仅在字符串只是您要匹配的文本时才有效。由于您实际上想要 找到 一个子字符串,请删除那些匹配器。

要搜索多个模式之一,请使用 | 逻辑正则表达式运算符。

最后,由于 Java 正则表达式是作为字符串文字给出的,任何特殊字符,尤其是 \,都需要转义。

因此,要构建一个可以 找到 匹配以下任何子字符串的正则表达式:

/^10.\d{4,9}/[-._;()/:A-Z0-9]+$/i
/^10.1002/[^\s]+$/i
/^10.\d{4}/\d+-\d+X?(\d+)\d+<[\d\w]+:[\d\w]*>\d+.\d+.\w+;\d$/i
/^10.1021/\w\w\d++$/i
/^10.1207/[\w\d]+\&\d+_\d+$/i

你会这样写:

String regex = "10.\d{4,9}/[-._;()/:A-Z0-9]+" +
              "|10.1002/[^\s]+" +
              "|10.\d{4}/\d+-\d+X?(\d+)\d+<[\d\w]+:[\d\w]*>\d+.\d+.\w+;\d" +
              "|10.1021/\w\w\d++" +
              "|10.1207/[\w\d]+\&\d+_\d+";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

String input = "http://journals.ametsoc.org/doi/full/10.1175/JPO3002.1";
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println("Start index: " + m.start() +
                       " End index: " + m.end() +
                       " " + m.group());
}

输出

Start index: 37 End index: 54 10.1175/JPO3002.1