我对正则表达式很体面但是难倒在这里。我在下面的第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组=公共或私人或受保护的
第2组= 0或更多“静态”或“最终”实例 < - 我正在努力解决 的问题
第3组=数据类型
第4组=变量名称
第5组=值
鉴于上述输入,第2组如下:
这是我提出的正则表达式,而id不适用于第2组:
^.*(public|private|protected)\s+(static\s+|final\s+)*\s+([^ ]+)\s+([^ ]+)\s*(;|=)(.*)$
对于第2组,我试过了:
“group 2”的正则表达式应与“static”或“final”的一个或多个实例匹配。一个适当的解决方案可以扩展,以匹配任何单词的任何子集,如[静态,最终,瞬态,易失性]。
答案 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*(;|=.*)$
答案 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)