Échapper une barre oblique dans une expression régulière

106

Ma question est simple et concerne l'échappement des expressions régulières. Devez-vous échapper une barre oblique /dans une expression régulière? Et comment feriez-vous cela?

Zerobu
la source
1
Quelle implémentation de langage / expression régulière utilisez-vous?
Gumbo
Chose intéressante, je cherchais cette question pour Javascript. Mais ensuite, mon IDE a dit que j'utilisais une évasion inutile. C'est donc myStr.replace(/[/:.-]+/gi, '_')valable à ma grande surprise. Je pensais que j'allais avoir besoin /[\/:.-]+/gi. Je ne peux pas décider si c'est cool ou déroutant.
Turbo

Réponses:

90

Quel contexte / langue? Certaines langues utilisent /comme délimiteur de modèle, donc oui, vous devez l'échapper, en fonction de la langue / du contexte. Vous lui échappez en mettant une barre oblique inverse devant lui: \/pour certains langages (comme PHP), vous pouvez utiliser d'autres caractères comme délimiteur et vous n'avez donc pas besoin de l'échapper. Mais AFAIK dans toutes les langues, la seule signification particulière /est qu'il peut être le délimiteur de motif désigné.

Crayon Violent
la source
38

Voici quelques options:

  • En Perl, vous pouvez choisir des délimiteurs alternatifs. Vous n'êtes pas confiné à m//. Vous pouvez en choisir un autre, par exemple m{}. Alors s'échapper n'est pas nécessaire. En fait, Damian Conway dans "Perl Best Practices" affirme que m{}c'est le seul délimiteur alternatif qui devrait être utilisé, et ceci est renforcé par Perl :: Critic (sur CPAN). Bien que vous puissiez vous en tirer avec une variété de caractères de délimitation alternatifs, //et {}semble être le plus clair à déchiffrer plus tard. Cependant, si l'un de ces choix entraîne trop d'échappatoires, choisissez celui qui se prête le mieux à la lisibilité. Des exemples courants sont m(...), m[...]et m!...!.

  • Dans les cas où vous ne pouvez pas ou préférez ne pas utiliser de délimiteurs alternatifs, vous pouvez échapper les barres obliques avec une barre oblique inverse: m/\/[^/]+$/par exemple (en utilisant un autre délimiteur qui pourrait devenir m{/[^/]+$}, qui peut lire plus clairement). Échapper à la barre oblique avec une barre oblique inverse est assez courant pour avoir gagné un nom et une page wikipedia: le syndrome du cure-dent penchée . Dans les expressions régulières où il n'y a qu'une seule instance, échapper à une barre oblique peut ne pas être considéré comme un obstacle à la lisibilité, mais si cela commence à devenir incontrôlable, et si votre langage autorise des délimiteurs alternatifs comme le fait Perl, cela être la solution préférée.

DavidO
la source
1
Pouvez-vous donner un exemple? J'ai ceci: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confet j'obtiens des conflits avec des barres obliques.
CMCDragonkai
Notez que vous utilisez un s, pas un m, lorsque vous effectuez un remplacement (aka substitut) avec des expressions régulières. perlfect.com/articles/regex.shtml
Mashmagar
2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... mais c'est probablement mieux: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confcar cela évite l'interpolation du shell.
DavidO
1
Une alternative à l'échappement du /caractère littéral est d'utiliser la fonctionnalité regex pour spécifier un caractère par son codage ASCII, en hexadécimal ou octal. Perl accepte la forme octale \57(source regular-expressions.info/refcharacters.html )
lukeuser
Dans la page liée par lukeuser (merci), il y a aussi la séquence d'échappement \ Q ... \ E. Cela a fonctionné pour moi.
user3012857 le
11

Utilisez la barre oblique inverse \ou choisissez un autre délimiteur, c.- m#.\d#à-d /.\d/ . Au lieu de "En Perl, vous pouvez changer le délimiteur / expression régulière en presque n'importe quel autre caractère spécial si vous le faites précéder de la lettre m (pour la correspondance);"


la source
6

Si le délimiteur est /, vous devrez vous échapper.

renard
la source
0

Si vous utilisez C #, vous n'avez pas besoin de l'échapper.

ShrapNull
la source
Peut-être, mais ici, ils utilisent perl.
Toto du
0

Pour java, vous n'en avez pas besoin.

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

Si vous mettez \ devant /. IDE vous dira "Échappement de personnage redondant" \ / "dans ReGex"

Amzero
la source