Java regex alternance de l'opérateur “|” comportement semble rompu

Essaie d'écrire une regex pour matcher chiffres romains. Dans le sed (qui, je pense, est considéré comme "standard" pour les regex?), si vous disposez de plusieurs options délimité par l'alternance de l'opérateur, elle correspond à la plus longue. À savoir, "I|II|III|IV" correspondra à "IV" pour "IV" et "III" pour "III"

En Java, le même schéma correspond à "I" pour "IV" et "I" pour "III". S'avère Java choisit entre l'alternance des matchs de gauche à droite; c'est parce que "je" apparaît avant "III" dans la regex, ça correspond. Si je change la regex pour "IV|III|II|I", le problème est corrigé, mais ce n'est évidemment pas une solution en général.

Est-il un moyen de faire de Java choisir le plus long match sur une alternance de groupe, au lieu de choisir le "premier"?

Un exemple de code pour plus de clarté:

public static void main(String[] args)
{
    Pattern p = Pattern.compile("six|sixty");
    Matcher m = p.matcher("The year was nineteen sixty five.");
    if (m.find())
    {
        System.out.println(m.group());
    }
    else
    {
        System.out.println("wtf?");
    }
}

Ce sorties "six"

Où il pourrait y avoir une (pas si bon). Séparer le schéma ci-dessus en différents modèles et effectuer l'arbitrage vous-même.

OriginalL'auteur Craig Kovatch | 2010-12-23