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

标签 java regex doi

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

我正在使用 Java 8 和 REGEX

我有found这些正则表达式应该满足我的要求

/^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

最佳答案

在 Java 中,正则表达式被写成字符串。在其他语言中,正则表达式使用 /.../ 引用,并在结尾 / 之后给出诸如 i 之类的选项。因此,在 Java 中写成 /XXX/i 的做法如下:

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

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

在大多数语言中,正则表达式用于查找匹配的子字符串。 Java 也可以使用 find() 来做到这一点方法(或许多 replaceXxx() 正则表达式方法中的任何一个),但是 Java 也有 matches()方法将匹配整个字符串,消除了对开始和结束边界匹配器 ^$ 的需要。

无论如何,你的问题是正则表达式同时具有 ^$ 边界匹配器,这意味着只有当 string 不是你想要匹配的文本时它才会起作用。由于您实际上想要查找子字符串,因此请删除这些匹配器。

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

最后,由于 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

关于java - Java String REGEX 识别 DOI 的正确格式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43683957/

相关文章:

jquery - 正则表达式匹配最后一个数字(如果它是单独的)

jquery - 如何通过正则表达式仅对数字验证 false?

ruby - 通过从 matlab : translation from ruby 发送 DOI 从 crossref 检索 bibtex 数据

java - 使用 JaxRS 自定义 JSON 序列化

java - 改进错误 URL 查询字符串在提供动态值时不得有替换 block

android - 如何在android正则表达式中排除数字

regex - 在文档或页面中查找 DOI

java - 获取存储的实际数字

java - 如何使用java从XML文件中删除&?