正则表达式以任何顺序匹配0个或更多关键字实例

时间:2011-12-15 16:01:42

标签: regex

我对正则表达式很体面但是难倒在这里。我在下面的第2组时遇到了问题。但是,我认为这对于正则表达式大师来说应该相当容易......

问题

我正在尝试匹配zero or more instances of a set of keywords, in any order


[更新:供将来参考]
最简单的解决方案(源自black panda的响应)是:

((keyword1 | keyword2 | keyword3 )*)

注意:每个单词后面的空格是必不可少的!

就我而言,这转化为:
((static |final )*)

这是最简单,最简单的答案。更好,更高效的方法是black panda的响应,如下所示。它允许任何数量的空白,并且RE引擎的处理速度更快。


输入

我需要将以下输入拆分为非常具体的组。

注意:数字不是输入的一部分。也就是说,每个输入行以字母p开头。

  1. public static final int ONE = 1;
  2. public final static int TWO = 2;
  3. public final int THREE = 3;
  4. public static int FOUR = 4;
  5. private int FIVE = 5;
  6. 我需要将输入分解为匹配组,以便

    第1组=公共或私人或受保护的 第2组= 0或更多“静态”或“最终”实例 < - 我正在努力解决 的问题 第3组=数据类型
    第4组=变量名称
    第5组=值

    第2组详情

    鉴于上述输入,第2组如下:

    1. 静态最终
    2. final static
    3. 最终
    4. 静态
    5. [空字符串]
    6. 失败的解决方案

      这是我提出的正则表达式,而id不适用于第2组:

      ^.*(public|private|protected)\s+(static\s+|final\s+)*\s+([^ ]+)\s+([^ ]+)\s*(;|=)(.*)$
      

      对于第2组,我试过了:

      • (静态\ S + |最终\ S +)*
      • (静态|最终)* \ S +
      • (静态|最终)*
      • (静态\ |最终\)*

      摘要

      “group 2”的正则表达式应与“static”或“final”的一个或多个实例匹配。一个适当的解决方案可以扩展,以匹配任何单词的任何子集,如[静态,最终,瞬态,易失性]。

4 个答案:

答案 0 :(得分:2)

你能抓住中间的一切,并确保第3组及更大的组存在吗?

第2组= ((?:(?:static|final|transient|volatile)\s+)*)

答案 1 :(得分:0)

您可以尝试:

^(?!.*\bstatic\s+static\b)(?!.*\bfinal\s+final\b).*(public|private|protected)\s+(static\s+|final\s+)?(static\s+|final\s+)?(\S+)\s+(\S+)\s*(;|=.*)$

See it

答案 2 :(得分:0)

匹配“static”或“final”字样的零个或多个实例:

(static|final)*

从这些perl片段中可以看出:

perl -e '$_ = "static final"; print $1 if /(static|final)*/;'  # prints "static"
perl -e '$_ = ""; print "matched" if /(static|final)*/;'

如果您的比赛无效,那么问题很可能在其他地方

答案 3 :(得分:0)

怎么样:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump qw(dump);

while(<DATA>) {
    my @l = $_ =~ /^\s*(public|private|protected)\s+((?:static\s+|final\s+)*)\s*(\S+)\s+(\S+)(?:\s+=\s*(.*))?\s*;\s*$/;
    dump@l;
}

__DATA__
public static final int ONE = 1;
public final static int TWO = 2;
public final int THREE = 3;
public static int FOUR = 4;
private int FIVE = 5;

<强>输出:

("public", "static final", "int", "ONE", 1)
("public", "final static", "int", "TWO", 2)
("public", "final", "int", "THREE", 3)
("public", "static", "int", "FOUR", 4)
("private", "", "int", "FIVE", 5)