2010-12-02 3 views
1

Regex Motif - ([^=](\\s*[\\w-.]*)*$)Java Regex Engine Crashing

test String - paginationInput.entriesPerPage=5

Java Regex Engine Crashing/Prendre âge (>) 2Min trouver un match. Ce n'est pas le cas pour les entrées de test suivantes:

paginationInput=5 

paginationInput.entries=5 

Mon exigence est de mettre la main sur la chaîne du droite de = et le remplacer par quelque chose. Le motif ci-dessus le fait bien sauf pour l'entrée mentionnée ci-dessus.

Je veux comprendre pourquoi l'erreur et comment puis-je optimiser le Regex pour mes besoins afin d'éviter d'autres cas particuliers.

+3

regex semble trop lourde, avez-vous pensé à utiliser testString.split ("=") sur chaque ligne de ce fichier et à vérifier cette longueur == 2? Cela retournera un tableau et le second élément sera le côté droit du = –

+0

C'est la manière brute de le faire. Je le laisse comme dernier recours. – kaychaks

+1

Il y a trop de retour arrière autorisé dans votre regex, vous risquez donc d'avoir des débordements de pile si cela ne correspond pas rapidement. Essayez d'éviter d'imbriquer * s, ou voyez si vous pouvez les rendre possessifs - vous voulez l'aider à échouer plus rapidement. – CurtainDog

Répondre

1

Vous pouvez utiliser un regard en arrière pour vous assurer que votre chaîne commence au caractère après le =:

(?<=\\=)([\\s\\w\\-.]*)$ 

Quant à savoir pourquoi il se bloque, il est la deuxième * autour du groupe. Je ne sais pas pourquoi vous avez besoin que, puisque cela sonne comme vous demandez:

  • Un seul caractère, quoi que ce soit, mais égal à
  • Alors 0 ou plusieurs répétitions du groupe suivant:
    • Tous quantité d'espace blanc
    • Ensuite, toute quantité de caractères de texte, tableau de bord, ou un point
  • Fin de chaîne

Quoi qu'il en soit, supprimez ce *, et il ne tourne plus pour toujours, mais je continuerais à utiliser la regex plus spécifique en utilisant le look derrière.

En outre, je ne sais pas comment vous utilisez cela, mais pourquoi avez-vous le $ là-dedans? Ensuite, vous ne pouvez faire correspondre le dernier dans la chaîne (si vous en avez plus d'un). Il semble que vous seriez mieux avec un regard vert à la nouvelle ligne ou la fin: (?=\\n|$)

[Modifier ]: Mise à jour par commentaire ci-dessous.

+0

votre motif ne me donne pas le RHS de "=" dans la chaîne "something.operer = asda adad" car il a de l'espace entre les mots. Mon deuxième * était de prendre soin de ces instances.Et je n'aurai qu'une seule correspondance par chaîne donc je pourrais utiliser "$" – kaychaks

+0

Ah, eh bien si les espaces sont autorisés sur le côté droit, déplacez simplement le '\\ s' dans la classe de caractères au lieu d'ajouter un autre' * '. Vous avez seulement besoin de groupes répétitifs si le modèle est plus strict que cela. Mis à jour ma réponse aussi. – Nicole

+0

Je l'ai déjà fait, était sur le point de mettre à jour ici. Merci quand même pour l'aide. – kaychaks

0

Essayez ceci:

=\\s*(.*)$