代码之家  ›  专栏  ›  技术社区  ›  Prashanth

正则表达式捕捉句子中常量前的单词

  •  1
  • Prashanth  · 技术社区  · 7 年前

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

    示例:

    • 纽约市的转换程序。GENX应用程序。 -应显示 “纽约。GENX'
    • CAP-GENY应用程序的转换例程。 -应显示 “CAP-GENY”
    • NNUAT\u CHECK应用程序的转换例程。 -应显示 'NNUAT\u检查'
    • 为RUN\u脚本应用程序于2014年1月1日上午11:40创建。 -应显示 'NNUAT\u检查'
    • 2014年2月2日中午12:29为STOP\u服务器应用程序创建的事件。 -应显示 '停止服务器'

    如上所述,每个句子都以常量结尾 “应用程序。” . 我想在每个语句中捕捉该常量之前的单词。

    有没有一个简单的正则表达式可以做到这一点?我希望避免java中涉及字符串的多行代码。

    我尝试过这个方法,但它提取了一个语句中的所有单词,而我只需要常量前的一个单词。

    \w+(?=.*:)
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    看起来您期望的匹配项由非空白字符组成,因此,您可以使用

    \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 .

        2
  •  0
  •   Keith K    7 年前

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

    \b(\S+)\s+application
    

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

    或与Wiktor的结合。

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

    demo

        3
  •  0
  •   Przemysław Moskal    7 年前

    你可能想试试 "\\b([A-Z_\\-\\.]+)\\s+application"

    \\b -单词边界

    A-Z_\\-\\. -匹配的单词只能包含从A到Z的字母、下划线、破折号和点

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

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