12
votes

Expression régulière pour correspondre aux caractères échappés (citations)

Je veux construire une simple regex qui couvre les cordes citées, y compris des citations évasées en eux. Par exemple, xxx

évidemment, quelque chose comme xxx

ne fonctionne pas, car il correspond à la première citation échappée.

Quelle est la version correcte?

Je suppose que la réponse serait la même pour les autres caractères échappés (en remplaçant simplement le caractère respectif).

Au fait, je Je suis conscient de la regex "attrape-tout" xxx

mais j'essaie de l'éviter dans la mesure du possible, car, sans surprise, il fonctionne un peu plus lent qu'un plus spécifique. < / p>


6 Réponses :


3
votes

Essayez celui-ci ... il préfère le \ " code>, si cela correspond, il le choisira, sinon il choisira " code>.

"((?:\\"|[^"])*)"


4 commentaires

Cela ne fonctionne pas. Quand j'essaie sur la chaîne "lorem \" ipsum \ "TRITANI Impédit Impedit CIVIBUS EI PRI , Regexbuddy me dit qu'il faut 215 étapes pour (incorrectement) correspondant " lorem \ "ipsum \" < / code>. Comparez cela à la solution @ Arcain, qui ne prend que 15 étapes (correctement) signaler une tentative de correspondance infructueuse.


@Alan, c'est vraiment intéressant que la mine correspond à des données sans soulise. Je suis content que vous ayez partagé cela avec moi - c'est comme obtenir un (bon) critique de code sur mes regexes. Parfois, je vais devoir investir dans cet outil Regexbuddy.


Oui, c'est très pratique, mais si vous n'avez pas investi dans MRE , faites-le en premier.


En fait, le motif que j'ai fourni a évolué d'un en maîtrisant des expressions régulières. Je pense que je l'utilise (le modèle) depuis près de dix ans maintenant.



18
votes

Voici celui que j'ai utilisé dans le passé:

"(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")"


2 commentaires

Votre regex ne fonctionnera pas sur \ "ceci est \" non censé être \ "valide"


@Maksymiuk Oui, tu es correct. Je m'attends à ce que la chaîne commence par une citation et je ne vérifie pas si ce premier citation est échappé. Si c'est quelque chose que vous devez faire, le motif peut être ajusté pour tenir compte de cela en utilisant un look négatif à l'envers: ((?



7
votes

Le problème avec toutes les autres réponses est qu'elles ne correspondent que pour les tests évidents initiaux, mais tombent rapidement à l'examen approfondi. Par exemple, toutes les réponses s'attendent à ce que la toute première citation ne soit pas échappée. Mais surtout, l'échappement est un processus plus complexe que celui d'une seule barre oblique inverse, car cette barre oblique inverse peut être échappée. Imaginez essayer de faire correspondre une chaîne qui se termine par une barre oblique inverse. Comment cela serait-il possible?

Ce serait le modèle que vous recherchez. Il ne suppose pas que la première citation est le fonctionnement, et elle permettra de s'échapper. xxx


1 commentaires

LookeDeHind Négatif n'est pas pris en charge dans JavaScript (pourtant: v8project.blogspot.com / 2016/02 / ... ).



1
votes

Veuillez trouver dans le code ci-dessous, comprenant l'évaluation d'expression pour String B>, Number B> et Decimal B>.

public static void commaSeparatedStrings() {        
    String value = "'It\\'s my world', 'Hello World', 'What\\'s up', 'It\\'s just what I expected.'";

    if (value.matches("'([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.]+'(((,)|(,\\s))'([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.]+')*")) {
        System.out.println("Valid...");
    } else {
        System.out.println("Invalid...");
    }
}

/**
 * 
 */
public static void commaSeparatedDecimals() {
    String value = "-111.00, 22111.00, -1.00";
    // "\\d+([,]|[,\\s]\\d+)*"
    if (value.matches(
            "^([-]?)\\d+\\.\\d{1,10}?(((,)|(,\\s))([-]?)\\d+\\.\\d{1,10}?)*")) {
        System.out.println("Valid...");
    } else {
        System.out.println("Invalid...");
    }
}

/**
 * 
 */
public static void commaSeparatedNumbers() {
    String value = "-11, 22, -31";      
    if (value.matches("^([-]?)\\d+(((,)|(,\\s))([-]?)\\d+)*")) {
        System.out.println("Valid...");
    } else {
        System.out.println("Invalid...");
    }
}


0 commentaires

1
votes

Ce xxx pré>

capturera toutes les cordes (dans les guillemets doubles), y compris \ "et \\ Séquences d'échappement. (Notez que cette réponse suppose que le seulement em> Les séquences d'échappement dans votre chaîne sont des séquences \ "ou \\ - Aucun autre caractères de barre oblique inverse ou séquences d'échappement ne sera capturée.) P>

(\\                       # get the preceding slash (for each section)
  (?:b|t|n|f|r|\"|\\)     # capture common sequences like \n and \t

  |\\                     # OR (get the preceding slash and)...
  # capture variable-width octal escape sequences like \02, \13, or \377
  (?:(?:[0-2][0-9]{1,2}|3[0-6][0-9]|37[0-7]|[0-9]{1,2}))

  |\\                     # OR (get the preceding slash and)...
  (?:u(?:[0-9a-fA-F]{4})) # capture fixed-width Unicode sequences like \u0242 or \uFFAD
)


0 commentaires

1
votes

Cela fonctionne pour moi et c'est plus simple que la réponse actuelle xxx

(? - avant " ne doit pas être \ , et cette expression est laissée et droite.

(\\ "| [^"]) * - que dans les citations intérieures: Peut-être être échappé citations \\ " ou quoi que ce soit pour, sauf guillemets [^"]

réégyvaleur actuel fonctionne correctement pour suivre les chaînes: < p> 234 - false ou null

"234" - vrai ou ["234"]

"" - true ou [""]

"234 + 321 \\" 24 \\ "" - true ou ["234 + 321 \\ "24 \\" "]

" 234 + 321 \\ "24 \\" "+ 123 +" \\ "test (\\" 235 \\ ") \\ "" - true

ou ["234 + 321 \\" 24 \\ "", test "\\" "235 \\") \\ ""]

"234 + 321 \\" 24 \\ "" + 123 + "\\" test (\\ "235 \\ ") \\" \\ " - true

ou [" 234 + 321 \\ "24 \\" "]


0 commentaires