0

私の入力は次のようなものです:

line 1
**ER1.RIAA.SOMPSFIO(LIAOEE)         UTGD788  FDSJOFUZZÄ                                                                                                                                                                              line2      
JNDJZSDS ER1.RIAA.SIMEDFUA(AUDD)                YIRIHFIH1465EZZÄ     

line 3
UJZRJOERERÃLDE,UIE='UJ1.DHZKZ5.OZDEZN98.AAERRE',I=DZEDE                   POPZEOE**

ピリオドのある文字のみを取得したい、つまり:

ER1.RIAA.SOMPSFIO
ER1.RIAA.SIMEDFUA
UJ1.DHZKZ5.OZDEZN98.AAERRE

私の解決策は次のとおりです。

try {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        nrligne++;

int counter = 0;

for (int i=0; i<line.length(); i++ ) {
    if( line.charAt(i) == '.' ) {
        counter++;
    }
}

if (counter == 2) {

    if (line.matches("^.*[A-Z0-9]+\\..[A-Z1-9]+.*$")){

        line= removeTroublesomeCharacters(line);
        System.out.println("ligne vaut "+line);

        Pattern dsnPattern = Pattern.compile("^.*([A-Z0-9]+)\\..([A-Z1-9]+)\\..([A-Z1-9]+).*$");
        Matcher m = dsnPattern.matcher(line);

        if (m.matches()) {
            String part1   = m.group(1);
            String part2   = m.group(2);
            String part3   = m.group(3);

            System.out.println("part1 vaut "+part1);
            System.out.println("part2 vaut "+part2);
            System.out.println("part2 vaut "+part3);
        }               
    }

とりあえず結果は

ligne vaut ER1.RIAA.SOMPSFIO(LIAOEE)                                                                                             UTGD788
part1 vaut 1
part2 vaut IAA
part2 vaut OMPSFIO
ligne vaut PZFDSJOFUZZÃâ                                                                                                                                                                                    ER1.RIAA.SIMEDFUA(AUDD)                                                                                             UOOO88
part1 vaut 1
part2 vaut IAA
part2 vaut IMEDFUA
ligne vaut UJZRJOERERÃLDE,UIE='UJ1.DHZKZ5.OZDEZN98',I=DZEDE                                                                                                                                                                                                                                                                      POPZEOE
part1 vaut 1
part2 vaut HZKZ5
part2 vaut ZDEZN98

入力ファイル: http://uploadhero.co/dl/PWBLhi7d 正規表現が各文字の先頭を食べる理由がわかりません。誰かがこれを修正するのを手伝ってくれますか?

4

2 に答える 2

1

の後に余分な文字を消費してdotいて、文字クラスに含めていないためです。

\\..   // this will match a dot, and then following single character.

また、.*正規表現の先頭を にします.*?。量指定子はデフォルトで貪欲であるため、すべての文字を消費し、 の直前に 1 つの単語を残して.一致させ([a-z0-9]+)ます。

正規表現を次のように変更します。

"^.*?([A-Z0-9]+)\\.([A-Z1-9]+)\\.([A-Z1-9]+).*$"

また、とにかくPatternandを使用しているので、メソッドの使用を検討し、必要な部分だけパターンを構築します。MatcherMatcher#find()

Pattern dsnPattern = Pattern.compile("([A-Z0-9]+)\\.([A-Z1-9]+)\\.([A-Z1-9]+)");
Matcher m = dsnPattern.matcher(line);

if (m.find()) {
于 2013-10-09T21:32:30.237 に答える