簡體   English   中英

什么是Java字符串REGEX的正確格式以標識DOI

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM