2013-01-16 2 views
1

J'ai besoin d'un motif Java pour une chaîne non délimitée par un caractère.
Motif Regex pour une chaîne non délimitée par un caractère

J'ai une chaîne (comme mentionné ci-dessous), avec certains accolades délimitées par des guillemets simples et d'autres accolades qui ne le sont pas. Je veux remplacer les accolades qui ne sont pas délimitées par des guillemets simples, avec une autre chaîne.

Chaîne d'origine:

this is single-quoted curly '{'something'}' and this is {not} end 

a besoin d'être converti en

this is single-quoted curly '{'something'}' and this is <<not>> end 

Notez que les accolades {} qui ne sont pas délimitées par des guillemets simples ont été remplacés par < < >>.

Cependant, mes impressions de code (personnage se dévorée) le texte comme

this is single-quoted curly '{'something'}' and this is<<no>> end 

lorsque j'utilise le modèle

[^']([{}]) 

Mon code est

String regex = "[^']([{}])"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(str); 

while (matcher.find()) { 
    if ("{".equals(matcher.group(1))) { 
     matcher.appendReplacement(strBuffer, "&lt;&lt;"); 
    } else if ("}".equals(matcher.group(1))) { 
     matcher.appendReplacement(strBuffer, "&gt;&gt;"); 
    } 
} 
matcher.appendTail(strBuffer); 

Répondre

3

Ceci est un cas d'utilisation claire pour les assertions de longueur nulle. Le regex dont vous avez besoin est pas très complexe:

String 
    input = "this is single-quoted curly '{'something'}' and this is {not} end", 
    output = "this is single-quoted curly '{'something'}' and this is <<not>> end"; 
System.out.println(input.replaceAll("(?<!')\\{(.*?)\\}(?!')", "<<$1>>") 
         .equals(output)); 

impressions

true 
+0

+1, Merci d'avoir signalé la faille dans ma réponse (maintenant supprimée). – jlordo

+0

Merci beaucoup, c'était utile –

+0

Désolé tout le monde, incapable de répondre sur les réponses (dit ... pas assez de réputations). Vous avez répondu Oui à la question "Cet article vous a-t-il été utile?" question. –

1

Utilisez le négatif lookahead/lookbehind construit à partir de the special constructs section de la documentation Java Pattern.

+2

Une façon « plus simple » est d'utiliser la capture et le groupe backreference dans la chaîne de remplacement. – nhahtdh

+0

@nhahtdh oui, mais je n'appellerais pas cela plus simple, je l'appellerais plus désordonné. J'aime mettre tous les motifs dans le motif si c'est possible, et non dans la logique de traitement. –

+0

C'est "plus simple" (entre guillemets), car il peut ne pas s'appliquer à tout le monde. Bien sûr, personnellement, j'utiliserais un look-around. – nhahtdh

0

Essayez ceci:

String regex = "([^'])([{}])"; 
    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher = pattern.matcher(str); 

    while (matcher.find()) { 
     if ("{".equals(matcher.group(2))) { 
      matcher.appendReplacement(strBuffer, matcher.group(1) + "<<"); 
     } else if ("}".equals(matcher.group(2))) { 
      matcher.appendReplacement(strBuffer,matcher.group(1) + ">>"); 
     } 
    } 
    matcher.appendTail(strBuffer); 
+0

Juste une correction de votre propre code. :) –

+0

Merci pour la correction. J'ai essayé quelques regex-s sans succès mais c'est génial. :) –

+0

Vous devriez avoir accepté ma réponse si cela a fonctionné pour vous. :/ –

Questions connexes