正则表达式在句子中的常量之前捕获单词

时间:2018-01-29 21:28:53

标签: java regex regex-group

我有多个以常量结尾的语句,并且在该常量前面有一个变量(文件名)。

示例:

  • NYC.GENX应用程序的转换例程。 - 应显示' NYC.GENX'
  • CAP-GENY应用程序的转换例程。 - 应显示' CAP-GENY'
  • NNUAT_CHECK应用程序的转换例程。 - 应显示' NNUAT_CHECK'
  • 于2014年1月1日上午11:40为RUN_SCRIPT应用程序创建。 - 应显示' NNUAT_CHECK'
  • 在2月2日下午12:29为STOP_SERVER应用程序创建的事件。 - 应显示' STOP_SERVER'

正如您在上面所看到的,每个句子都以一个持续的'应用程序结束。' 。我希望在每个语句中捕获该常量之前的单词。

是否有一个简单的正则表达式可以做到这一点?我想避免在涉及字符串的java中使用多行代码来执行此操作。

我试过这个,但它只是在一个语句中取出所有单词,而我只想要一个常量之前的一个单词。

aws s3 ls s3://bucket/key..

3 个答案:

答案 0 :(得分:1)

您的预期匹配似乎由非空白字符组成,因此,您可以使用

\S+(?=\s+application)

请参阅regex demo

下面,

  • \S+ - 匹配除空格之外的1个或多个字符...
  • (?=\s+application) - 如果紧跟1+空白字符(\s+)和application子字符串。

另一个解决方案可能是匹配1+大写字母后跟任何标点符号,然后再匹配1+大写字母(即,如果要求看起来像这样)。然后使用

[A-Z]+(?:\p{Punct}[A-Z]+)*(?=\s+application)

请参阅another (PCRE variation with [[:punct:]], in Java it is \p{Punct}) demo

答案 1 :(得分:0)

您可以尝试"\\b([A-Z_\\-\\.]+)\\s+application"

\\b - 字边界

A-Z_\\-\\. - 匹配的字只能包含A到Z,下划线,短划线和点的字母

s+ - 一个或多个空白字符

如您所见,匹配的单词包含在括号内的捕获组中。

答案 2 :(得分:0)

(\ S +)捕获组中的所有非空格,后跟\ s +空格字符和单词application。

\b(\S+)\s+application

这会将所需的文本放入捕获组。

或与Wiktor的结合。

\b(\S+)(?=\s+application)

demo