7
votes

Comment garder le délimiteur lors de l'utilisation de Regex?

J'ai fait une question sur la ponctuation et la regex, mais c'était confus.

SUPOSING, j'ai ce texte: P>

public static final String PUNCTUATION_SEPARATOR =
        "("
        + "("
        + "(?=^[\"'!?.,;:(){}\\[\\]]+)"
        + "|"
        + "(?<=^[\"'!?.,;:(){}\\[\\]]+)"
        + ")"
        + "|"
        + "("
        + "(?=[\"'!?.,;:(){}\\[\\]]+($|\n))"
        + "|"
        + "(?<=[\"'!?.,;:(){}\\[\\]]+($|\n))"
        + ")"
        + ")";


1 commentaires

5 Réponses :



2
votes

Êtes-vous sûr de vouloir utiliser Regex? Il y a une implémentation plus rapide pour la division par un seul Char: StringTokenizer. Et cela peut renvoyer les délimiteurs.

String str= "word1, word2. word3? word4!";
String delim = ",.!?";
StringTokenizer st = new StringTokenizer(str, delim, true);
while (st.hasMoreTokens()) {
  String token = st.nextToken();
  ... // token will be: "word1", ",", " word2", ".", etc...
}


2 commentaires

Cela fonctionne, mais doit être regex ou quelque chose de plus complexe, car je veux seulement cracher sur les frontières (début et fin) et non au milieu.


Je veux dire que si le symbole est au milieu de la chaîne (A-B, 20.50), je ne veux pas écrire, seulement dans les frontières (test, [100, etc.).



1
votes

Pour les séparateurs simples, je recommande le StringTokenizer. Mais voici une solution utilisant REGEX et un autre séparateur auxiliaire:

String s  = "one,two, three   four ,  five";
s = s.replaceAll("([,\\s]+)", "#$1#");
Pattern p = Pattern.compile("#");
String[] result = p.split(s);


0 commentaires

1
votes

Voici une regex que je pense fonctionnera: xxx


0 commentaires

0
votes
public static final String PUNCTUATION_SEPARATOR =
    "("
    + "("
    + "(?=^[\"'!?.,;:(){}\\[\\]-]+)"
    + "|"
    + "(?<=^[\"'!?.,;:(){}\\[\\]-]+)"
    + ")"
    + "|"
    + "("
    + "(?=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + "|"
    + "(?<=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + ")"
    + ")";

0 commentaires