[英]Whats the correct format of Java String REGEX to identify DOI
我正在進行一些有關以自由格式文本識別DOI的研究。
我正在使用Java 8和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 regex語法或某種其他語言的語法。 另外,您沒有在正則表達式中轉義文字點,並且模式標記的開頭不正確。
碼:
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中,正則表達式寫為String。 在其他語言中,使用/.../
引用正則表達式,並在/
結束后給出類似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()
方法將匹配對整個字符串,省去了在開始和結束邊界匹配器^
和$
。
無論如何,您的問題是該正則表達式同時具有^
和$
邊界匹配器,這意味着它僅在字符串不是您要匹配的文本時才有效。 由於您實際上要查找子字符串,因此請刪除那些匹配器。
要搜索多個模式之一,請使用|
邏輯正則表達式運算符。
最后,由於Java正則表達式是以String文字形式給出的,因此任何特殊字符(尤其是\\
)都需要轉義。
因此,要構建一個可以找到與以下任意一項匹配的子字符串的正則表達式:
/^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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.