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