我正在尝试从段落中提取GRANT编号。授权号通常是 aplhanumeric,带有大写字母,中间可以有-
,但它们都没有任何空格。
以下是一些赠款示例:
W9124A-18-0001
007-FY2018
W81XWH18PRMRPTTDA
07-544
现在我甚至不确定一个段落是否会有授权,所以目前我依靠grant
这个词出现在授权号之前。
示例:
This research was supported by NIH/NHLBI Grant W9124A-18-0001(PI, Michael Brown)
我尝试使用以下正则表达式
(?i)grant [A-Z0-9-]*
但它并不完美,并且在不应该匹配时Grant w9124A-18-0001
匹配(小写w
(。我该如何改进它?
您可以使用表达式:
(?i)(?<=Grants)(?-i)[A-Z0-9-]+b
(?i)
不区分大小写。(?<=Grants)
Grant
后跟空格的正面回望。[A-Z0-9-]+
匹配数字,字母字符和破折号-
。(?-i)
关闭不区分大小写。b
字界。
您可以在这里现场尝试。
通过以下方式打开区分大小写,而不是禁用不区分大小写:
(?i)(?<=Grants)(?c)[A-Z0-9-]+b
仅受 Tcl 支持。
您需要在 Grant 之后关闭不区分大小写。
(?i)grant (?-i)[A-Z0-9-]*
从根本上说,你没有考虑案例。 您的正则表达式仅查找"授予",并且在"授予"上会失败。 更糟糕的是,您的授权标识符也有混合大小写,您的正则表达式也没有检查这一点。
解决此问题的最简单方法是确保您的正则表达式实际上支持这些值。 你在这里不需要任何太花哨的东西;只需执行简单的匹配即可。
[Gg]rant [A-Za-z0-9-]+
更高级的匹配 - 例如相对于授权 ID 的连字符删除部分的特定子组匹配 - 留给读者作为练习。