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");
}
此处演示:
在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
我正在进行一些关于在自由格式文本中识别 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");
}
此处演示:
在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