在一条线上提取多个标签

时间:2014-01-22 12:44:30

标签: java regex

我会尽力在我的解释^ ^中说清楚。我输入了一个逐行读取文件的文本(我逐字逐句地尝试过)。一旦我读到我应用一个有效的正则表达式,但输出文件不适合我,我得到这种类型的输出:

<pers> Sarkozy </pers>
<pers> Muscat </pers> , le secrétaire général , devant <pers> Sarkozy </pers>
<pers> Muscat </pers>

我希望:

<pers> Sarkozy </pers>
<pers> Muscat </pers>
<pers> Sarkozy </pers>
<pers> Muscat </pers> 

而且我无法理解问题所在......我觉得从它与我的模式匹配的那一刻起,我需要一条整行线而不仅仅是标签...我的正则表达式是不是很好或者它是不是我的方式来阅读我的文件?

我的代码:

public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        File file = new File(
                monfichier);
        String fileContent = readFileAsString(file.getAbsolutePath());

        countNE countne = new countNE();

        String result = countne.countNE(fileContent);
         System.out.println(result);


    }

    public String countNE(String fileContent) throws java.io.IOException {
        int i = 0;
        Hashtable<String, Integer> table = new Hashtable();
        int nbOcc = 0;

        String regPerson = "<pers>.?\\w*.?</pers>";

        Pattern pPers = Pattern.compile(regPerson);

        Matcher m = pPers.matcher(fileContent);
        String result = "";

        while (m.find()) {
            String person = m.group();
            // System.out.println(person + " " + i);
            // System.out.println(person);
            i++;
            result += person + "\n";
        }
        return result;

    }

    public static String readFileAsString(String filePath)
            throws java.io.IOException {
        String chaine = "";
        // lecture du fichier texte
        try {
            InputStream ips = new FileInputStream(filePath);
            InputStreamReader ipsr = new InputStreamReader(ips);
            BufferedReader br = new BufferedReader(ipsr);
            String ligne;
            while ((ligne = br.readLine()) != null) {
                chaine += ligne + "\n";

            }
            br.close();
        } catch (Exception e) {
            System.out.println(e.toString());
        }

        System.out.println(chaine);
        return chaine;
    }

}

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

问题是

.? 

在你的正则表达式中 它匹配任何内容,包括<pers></pers> 因此,为了获得您想要的内容,您可以首先拆分该行,或者通过使用较短的字符间隔进行匹配来排除<pers> .(例如[a-zA-Z]或类似)。< / p>

答案 1 :(得分:0)

正确的方式:

public static String countNE(String fileContent) throws java.io.IOException {
    Hashtable<String, Integer> table = new Hashtable();
    int nbOcc = 0;

    String regPerson = "(<pers>.*?</pers>)";
    // String regPerson = "(<.*>.*?</.*>)";

    Pattern pPers = Pattern.compile(regPerson);

    Matcher m = pPers.matcher(fileContent);
    String result = "";
    while(m.find())
    {
            result += m.group(1);
    }

    return result;
}