gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:51:58 25 4
gpt4 key购买 nike

我正在进行一些关于在自由格式文本中识别 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com