Javaファイルから列挙名を取得する方法は?

Javaファイルから列挙名を取得する方法は?

Javaの列挙型ファイルは構造的に乱雑になる可能性があります。列挙型の名前だけを取得しようとしています。

...
import com.mckesson.dex.model.activityLog.concreteFactory.ModifiedPropertyYesNoFactory;

public enum OrganizationActivityLogItemType implements IActivityLogItemType<OrganizationActivityLog>, DisplaysAs
{

    @Deprecated GENE_VARIANT_PUBLIC( "Gene Variant/Mutation/Allele", null ),

    VARIANTS_MUTATIONS( "Variants/Mutations/ Alleles/Loci/Probes", ALFactory.PUBLIC_PRIVATE ),
    CATEGORIES( "Categories", null ),
    PUBLIC_VISIBLITY_COVERED_WHEN_MEETS_NECESSITY_CRITERIA( "Covered - When Meets Medical Necessity Criteria",
                                                            ALFactory.PUBLIC_PRIVATE ),
    PUBLIC_VISIBLITY_NOT_COVERED_INVESTIGATIONAL(
        "Not Covered - Investigational",
        ALFactory.PUBLIC_PRIVATE ),
    PUBLIC_VISIBLITY_NOT_COVERED_NOT_MEDICALLY_NECESSARY(
        "Not Covered - Not Medically Necessary",
        ALFactory.PUBLIC_PRIVATE ),
...

近いですが、もっといいかもしれません。

awk '{ print $1 }' My.java | grep -v '^"' | grep -v '^ALFactory' | sed -e 's/(//'

Unix cliツールを使用してenumファイルからenum名を取得するには?

ソリューションは少なくともOS Xに移植する必要があります。なぜならそれが私の作業環境だからです。しかし、私はLinuxでも実行することを好みます。

答え1

perlこれを行うスクリプトは次のとおりです。コマンドラインからパイプコマンドを実行することは不可能であるか、メンテナンス不可能です。素朴なアプローチは

perl -npe 's/\b|\s+/\n/g' < My.java | grep '^[A-Z]\+_[A-Z_]\+'

しかし、次のスクリプトが良いです。

#!perl -w
my $content = do { local $/; <> };
my @tokens = split /\b|\s+/, $content;
my $n = 0;
my $skip;

foreach (@tokens) {
    $n++; $skip = 0;
    next if /\s+/;
    next if /"/ ... /"/;    # skip strings
    next if /\(/ .. /\)/;   # skip parameters
    next if /@/ .. /^\w+$/; # skip annotations
    $skip ||= 1  if $n == 1 .. /\benum\b/; # skip from beginning to enum
    $skip ||= 1  if /enum/ .. /\{/; # skip to open bracket
    next if $skip;
    last if /\}/;

    print $_, "\n";
}

関連情報