2010-09-21 9 views
1

J'ai fait de la recherche d'une regex qui peut être utilisée en règle générale pour interdire aux utilisateurs d'entrer des chemins de fichiers Windows sans échapper le "\". Jusqu'à présent, j'ai trouvé cette expressionComment reconnaître les chemins de fichiers Windows dans une chaîne en Perl?

[^ \\] *

$

Cependant, cela ne fonctionne pas pour ce qui suit:

C: test \\ Program Files \\

Par échec, je veux dire qu'il ne valide pas cette chaîne. Toute aide serait grandement appréciée, et oui, je suis obligé d'utiliser regex.

+1

Quel langage/moteur regex utilisez-vous? –

+0

Perl 15 caractères allez ici – Woot4Moo

+0

Quel est le problème que vous essayez de résoudre? Pourquoi ne voulez-vous pas que vos utilisateurs entrent des chemins de fichiers Windows non échappés? – CanSpice

Répondre

4
^(\\\\|[^\\])*$ 

correspondront chaînes qui ne contiennent que des caractères ou se sont échappés \\ non caractères. (Pour un peu de performances, vous pouvez l'améliorer à: ^(?:\\\\|[^\\]+)*$)

En Perl:

if ($subject =~ m/^(?:\\\\|[^\\]+)*$/) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

Cela correspond

C:\\Program Files\\test 
abcd 
h983475iuh 87435v z 87tr8v74 
\\\\\\\\\\ 

et ne parviennent

C:\Program Files\test 
\ 
\\\ 

etc.

+0

cela ne fonctionne pas en conséquence sur mon système – Woot4Moo

+0

Si je passe "C: \ Program Files \ testing" il l'accepte, ce n'est pas ce que je suis anticiper – Woot4Moo

+2

Essayez de passer 'C: \ Program Files \ testing' (en utilisant des guillemets simples au lieu de guillemets doubles). À l'intérieur des guillemets doubles, la barre oblique inverse est un caractère d'échappement; à l'intérieur des guillemets simples ce n'est pas. –

2

Si vous avez fait ce tour sur moi en tant qu'utilisateur de votre application, je serais plutôt ennuyé. Pourquoi pas au lieu de forcer l'utilisateur à fournir des données dans un certain format, vous reformater les données après que l'utilisateur l'a entré? Jetez un oeil à la fonction quotemeta (perldoc -f quotemeta), qui va automatiquement échapper à toutes les barres obliques inverses (et autres caractères potentiellement spéciaux) pour vous.

+0

Je vais y jeter un coup d'œil, mais très probablement je n'aurai pas beaucoup de mal à travailler avec. – Woot4Moo

+1

+1: Cela devrait être le travail du programme de ne pas créer des choses bizarres de grattage de tête pour l'utilisateur. – dawg

+0

oh je suis entièrement d'accord drawk, mais parfois vous devez compter sur le fournisseur qui fournit les outils que vous utilisez. – Woot4Moo