|
|
1
49
好的,我目前正在从自由格式文本(XML)中提取数千个DOI,我意识到 my previous approach 有一些问题,即关于编码实体和尾随标点符号,所以我继续阅读 the specification 这是我能带的最好的了。
很简单,最初
此外,所有分配的注册人代码都是数字,长度至少为4位,因此:
然而,这并不是绝对必要的,第2.2.3节指出,不常见的后缀系统可能会使用其他约定(例如
现在情况变得更棘手了,从我处理的所有DOI中,我看到了以下字符(除了
合乎逻辑的选择是使用
现在我们有一个难题
现在,让我们使用负面前瞻来过滤标记:
上述内容应涵盖编码实体(
与标记语言不同,自由文本通常不使用标点符号,除非它们至少有一个空格 或 置于句末,例如:
这里的解决方案是关闭我们的捕获组并断言另一个单词边界:
和 瞧 , here is a demo . |
|
|
2
12
CrossRef has a recommendation ,他们成功测试了99.3%的DOI(他们知道):
|
|
|
3
4
@Silas理智检查是个好主意。然而,正则表达式并没有涵盖所有DOI。第一个元素(目前)必须是10,第二个元素(当前)必须是数字,但第三个元素几乎没有限制:
这才是真正的问题所在。在实践中,我从未见过使用空格,但规范特别允许使用空格。基本上,似乎没有一种合理的方法来检测空格 结束 DOI。 |
|
|
4
4
我敢肯定,在这一点上,这对OP没有多大帮助,但我想我会发布我正在尝试的东西,以防像我这样的人偶然发现这一点:
这匹配:“10点数字斜线任何非空格” 但对于我的使用(抓取HTML),这是在发现误报,所以我必须匹配上述内容,并去掉引号和大于/小于:
我仍在测试这些,但到目前为止,我感到充满希望。 |
|
|
5
3
以下是我的做法:
在一些有效的边缘情况下,这不会失败,但其他情况似乎会失败:
此外,正确地丢弃一些错误的(X|HT)ML内容,例如:
|
|
6
2
以下正则表达式应该可以完成这项工作(Perl正则表达式语法):
你可以通过打开网址进行一些额外的健全性检查
和
候选doi在哪里, 并测试您a)获得200 OK http状态,以及b)返回的页面不是该服务的“DOI未找到”页面。 |
|
|
7
0
这是一个非常古老的问题,但这里有另一个潜在的替代品。
这假设空白不是DOI的一部分。 还没有测试过误报,但它似乎能够找到本页中提到的所有边缘情况。 |
|
|
DotFX · RegEx捕获关键字前但括号后的所有内容 1 年前 |
|
|
Andrus · 如何在sql中查找第二个匹配项 1 年前 |
|
|
iato · 确保正则表达式不从命名材料中的数字中提取 1 年前 |
|
|
vr8ce · 非成对标记中特定字符的正则表达式 1 年前 |
|
|
MARTIN · 交换第一个和最后一个单词,反转所有中间的字符 1 年前 |
|
|
Carsten · 使用最近的搜索模式更改文本块 1 年前 |