/ / java.util.regex.PatternSyntaxException: Méta caractère suspendu '?' - java, regex, groovy

java.util.regex.PatternSyntaxException: caractère méta en suspens '?' - jge, regex, groovy

J'ai un regEx def regex = "^Line[\s]+(?:(\d+)\s)?\s*:\s+(\d+)?.+"; qui correspond aux chaînes ci-dessous

Line 1 : testMessage1
Line : 2 testMessage2

Maintenant, j'essaie de faire regex pour faire : comme facultatif pour qu'il puisse correspondre à des chaînes comme

Line 3 testMessage3

J'ai essayé de changer mon regEx en tant que ^Line[s]+(?:?(d+)s)?s*:?s+(d+)?.+

java.util.regex.PatternSyntaxException: Dangling meta character "?" near index 13
^Line[s]+(?:?(d+)s)?s*:?s+(d+)?.+

quelqu'un peut-il m'aider s'il vous plaît à réparer le regEx?

Réponses:

2 pour la réponse № 1

Vous avez une erreur de syntaxe dans votre regex:

^Line[s]+(?:?(d+)s)?s*:?s+(d+)?.+
^----- Here, remove this "?"

Par contre, si vous voulez que les deux points soient optionnels, vous devez corriger le problème. s:

Lines+(?:(d+)s*)?s*:?s+(d+)?.+
^---- Here

Démo de travail

De plus, j'ai nettoyé un peu votre regex que vous pourriez trouver utile:

Lines+(d)?s*:?s*(d)?.*

1 pour la réponse № 2
^Line[s]+(?:?(d+)s)?s*:?s+(d+)?.+
^----- This is a mistake

le ? il y a une erreur, parce que le : fait partie d'un (?:...) expression de regroupement, pas un littéral : personnage.

Essayons de retravailler votre regex en fonction de vos besoins:

  • Commencer avec Line
  • Suivi d'au moins 1 espace
  • Suivi par l'un des:
    • Chiffres et un ou plusieurs espaces et :
    • : et un ou plusieurs espaces et chiffres
    • Chiffres
  • Suivi par l'espace
  • Suivi de quoi que ce soit

Ce modèle correspond à vos 3 exemples:

"^Line\s+(\d+\s+:|:\s+\d+|\d+) .*"