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

时间:2018-08-14 14:42:31

标签: java regex

我正在尝试从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)。我该如何改善?

3 个答案:

答案 0 :(得分:5)

您可以使用以下表达式:

(?i)(?<=Grant\s)(?-i)[A-Z0-9-]+\b
  • (?i)不区分大小写。
  • (?<=Grant\s)Grant进行正向查找,后跟空格。
  • [A-Z0-9-]+匹配数字,字母字符和破折号-
  • (?-i)关闭不区分大小写。
  • \b字边界。

您可以在线体验here

通过以下方式打开区分大小写,而不是禁用不区分大小写:

(?i)(?<=Grant\s)(?c)[A-Z0-9-]+\b

only supported by Tcl

答案 1 :(得分:3)

您需要在Grant之后关闭不区分大小写的内容。

(?i)grant (?-i)[A-Z0-9-]*

答案 2 :(得分:0)

从根本上讲,您并没有考虑到案例。您的正则表达式仅查找“ grant”,而对“ Grant”将失败。更糟糕的是,您的授权标识符也有大小写混合的情况,并且您的正则表达式也不会检查

解决此问题的最简单方法是确保您的正则表达式实际上支持这些值。您在这里不需要任何花哨的东西。只需执行简单的匹配即可。

[Gg]rant [A-Za-z0-9\-]+

专家匹配(例如,与授予ID的连字符消除部分相关的特定子组匹配)作为练习供读者阅读。