用于提取 Java 中不区分大小写的子字符串的正则表达式



我正在尝试从段落中提取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 的连字符删除部分的特定子组匹配 - 留给读者作为练习。

最新更新