Pourquoi les suivants ne changent-t-il pas le texte pour moi dans Android? Il renvoie la valeur d'origine sans modification. Je m'attendrais à ce qu'il remplace le centre Qu'est-ce que je manque ici ? p> EDIT: D'accord, je comprends pourquoi = test = code> avec ^ code> et $ code> ne fonctionne pas. Le point est que j'ai besoin de quelque chose qui correspond au texte à la fois au début et à la fin d'une ligne, par exemple une ligne qui ne contient que "= un peu de texte =". La plupart des réponses données ne sont pas suffisantes, pour les raisons suivantes: p> = (. +) = Code> n'a rien à voir avec les terminaisons de ligne, alors correspond donc à une ligne avec deux = code> dans celui qui ne sont pas côte à côte. p> . * = (. +) =. * code> correspond à toute la ligne, mais a Le même problème que le précédent p> \ n = (. +) = \ n code> se rapproche, mais ne correspond pas à deux lignes d'une ligne (par exemple, test \ n = test = \ n = test = \ ntest code>) Il ne correspond pas également à une instance sur la première ou la dernière ligne p> (? <= \ n) = (. +) = (? = \ n) code> fonctionne presque, mais à nouveau ne correspond pas à une instance sur la première ou la dernière ligne p> (? est le seul qui semble correspondre à chaque ligne qui démarre et se termine par = code>, par exemple, mais 1 $ contient à la fois le remplacement et la chaîne d'origine. p> content = content.replaceall ("(? <= (\ n | ^ ^ ^)) = (. +) = (\ n | €))" Grand> 2 $ taille: grande> "); code> est la seule réponse qui semble faire en réalité faire ce qu'il devrait. P > p>
5 Réponses :
Eh bien, comme vous l'avez déjà dit, il s'agit de marqueurs de début / de fin de la regex. Essayez de changer l'expression: Pour faire correspondre le début de la ligne, vous pouvez utiliser ceci: ^ code> n'est pas le début d'une ligne mais de la chaîne entière, également $ code> est la fin de la chaîne entière. P>
^. * = (. +) =. * $ code> ou laissez ces marqueurs dehors: = (. +) = p >
(?: ^ | \ n) = (. *) = code>. De mes tests en Java Plain, il semble que la pause de la ligne de fuite ne soit pas reconnue, mais cela pourrait être différent dans Android. P>
D'accord, je vois ça maintenant; N'y a-t-il aucun moyen de faire correspondre le début et la fin d'une ligne?
dans les objets de chaîne Java \ n code> n'est pas considéré comme un début d'une ligne ou une fin d'une ligne. C'est une alimentation en ligne. Pour correspondre à cela, vous devez modifier votre code en String content = "test\n=test=\n=test=\ntest";
String[] pieces = content.split("[\r\n]");
StringBuilder replaced = new StringBuilder();
for (int i=0; i<pieces.length; i++) {
String piece = pieces[i].replaceAll("^=(.+)=$", "<size:large>$1</size:large>");
replaced.append(piece);
replaced.append('\n');
}
Cela remplace également les nouvelles lignes du résultat. Vous devrez les ajouter à la chaîne de remplacement.
Je ne suis pas sûr de l'Android ici, mais de mes tests en Java Plain, il semble que le trailing \ n code> n'est pas reconnu.
@Thomes ne savent pas pourquoi. Ça marche pour moi. Laissez-vous la chaîne d'un fichier ou d'un même objet de chaîne que dans l'exemple? À partir d'un fichier, la regex devra correspondre à \ r code> ou \ n code>, pour tenir compte du CRLF.
Merci, c'est ce que j'essaie; Le problème est que cela ne fonctionne pas pour dire test \ n = test = \ n = test = \ ntest code> - il ne correspond que le premier, pas la deuxième instance.
C'est parce qu'une fois \ n = test = \ n code> a été assorti, les caractères suivants sont = test = \ n code>. Il n'y a pas \ n dans le prochain ensemble pour correspondre à la regex.
Oui, je sais, je voulais juste souligner que cette réponse ne fonctionne pas parfaitement pour moi. Voir le commentaire à ma question pour une réponse qui semble fonctionner ...
D'accord, je pense avoir une réponse ... Cela semble fonctionner: n'est-ce pas? p> Edit: Ce qui précède ne fonctionne pas , pour une raison quelconque, il copie le texte original et la place après le texte substitué ... Voici ce qu'on a finalement travaillé: p>
C'est vague. Le Docs pour motif dire que . code> peut correspondre ou ne correspond pas à des terminaiseurs de ligne i>.
Je suppose que le . Code> ne correspond que des terminateurs de ligne si vous définissez motif.dotall code>, non?
Ouais c'est la raison derrière peut ou non i>, mais je ne sais toujours pas comment cela s'applique à string.replaceall code>; Peut-être que via (? s) code> dans le motif. Le bit dotall code> dit que . Code> ne doit pas correspondre à des lignes neuves par défaut.
Sur la base des tests, je peux confirmer que cela ne fonctionne pas par défaut.
Le meilleur moyen de faire face à cela est de définir à l'aide de si vous ne em> pas utiliser modèle.Multiline code> . En utilisant multiline code>, ^ code> et $ code> correspondra à des lignes séparées à l'aide de \ n code> et de manipulera la même manière Le début de l'entrée et la fin de l'entrée. string.replaceall code> Vous devez définir ces dans em> le motif à l'aide d'une expression d'indicateur intégré (? m ) code>, pour multiline code>: p> multiline code>, vous devez utiliser positif em> lookahead et lookbehind pour le \ n code>, et la regex est compliquée afin de correspondre à la première ligne, et la dernière ligne s'il n'y a pas \ n code> à la fin, par exemple Si notre entrée est la suivante: = test = \ n = test = \ n = test = \ n = test = code>. p> String pattern = "(?<=(?:^|\n))=(.+)=(?=(?:\n|$))";
content = str.replaceAll(pattern, "<size:large>$1</size:large>");
En fait, cela ne correspondra pas à la première ou dernière ligne, n'est-ce pas? Lookahead négatif est probablement mieux ...
Je ne vois aucun besoin pour le modificateur UNIX_LINES. En fait, si le texte a des séparateurs de lignes de style DOS ( \ r \ n code>), le modificateur (? dm) code> rendra l'échec du regex, tandis que (? m) code> seul fonctionne bien.
@Alanmoore tout à fait à propos de Unix_line. J'ai édité la réponse à ne pas conserver sur seulement multiligne. Merci.
Votre regex d'origine fonctionne bien si vous activez le mode multiligne, en utilisant maintenant code> ^ code> et < Code> $ code> correspond effectivement aux limites de la ligne. p> p> (? m) code>:
Merci, c'était la réponse que je cherchais!
Cela semble fonctionner:
content.replaceall ("(? ") Code>(? et(? <= \ n) code> Pouvez-vous expliquer cette syntaxe de regex? Je suis en fait confus paret<= code>