我正在尝试从a段中提取GRANT数字。奖助金数字通常是一个数字,由大写字母组成,中间可以有-
,但它们都是不带空格的。
以下是一些拨款的例子:
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
)。我该如何改进它呢?
发布于 2018-08-14 22:49:58
您可以使用以下表达式:
(?i)(?<=Grant\s)(?-i)[A-Z0-9-]+\b
(?i)
Case insensitive.(?<=Grant\s)
正向查找后跟whitespace.[A-Z0-9-]+
匹配数字、字母字符和破折号的单词,并关闭case -
.(?-i)
insensitivity.\b
Grant
。你可以在here现场试用一下。
使用以下命令打开区分大小写,而不是禁用不区分大小写:
(?i)(?<=Grant\s)(?c)[A-Z0-9-]+\b
发布于 2018-08-14 23:12:49
在Grant之后,您需要关闭不区分大小写。
(?i)grant (?-i)[A-Z0-9-]*
发布于 2018-08-14 22:50:00
从根本上说,你不是在考虑案例。您的正则表达式目前只查找"Grant“,在"grant”上将失败。更糟糕的是,您的授权标识符也有大小写混合的情况,而您的正则表达式也没有对此进行检查。
解决这个问题的最简单方法是确保您的正则表达式确实支持这些值。这里不需要太花哨的东西;只需执行简单的匹配即可。
[Gg]rant [A-Za-z0-9\-]+
更复杂的匹配-例如与授予ID的连字符分隔部分相关的特定子组匹配-留给读者作为练习。
https://stackoverflow.com/questions/51844078
复制相似问题