web-dev-qa-db-fra.com

Comment faire correspondre les traits d'union avec une expression régulière?

Comment réécrire le [a-zA-Z0-9!$* \t\r\n] modèle pour faire correspondre le trait d'union avec les caractères existants?

66
Thomas Anderson

Échapper au trait d'union.

[a-zA-Z0-9!$* \t\r\n\-]

[~ # ~] met à jour [~ # ~] :
Peu importe cette réponse - vous pouvez ajouter le trait d'union au groupe mais vous n'avez pas à l'échapper. Voir réponse de Konrad Rudolph à la place qui répond beaucoup mieux et explique pourquoi.

63
Neil Barnwell

Le trait d'union est généralement un caractère normal dans les expressions régulières. C’est seulement dans une classe de caractères et entre deux autres caractères que cela prend une signification spéciale.

Ainsi:

  • [-] correspond à un trait d'union.
  • [abc-] correspond à a, b, c ou à un trait d'union.
  • [-abc] correspond à a, b, c ou à un trait d'union.
  • [ab-d] correspond à a, b, c ou d ( uniquement ici le trait d'union indique une plage de caractères).
153
Konrad Rudolph

C’est moins déroutant de toujours utiliser un trait d’union échappé, afin qu’il ne soit pas dépendant de la position. C'est un \- dans la classe de caractères entre crochets.

Mais il y a autre chose à considérer. Certains de ces caractères énumérés devraient éventuellement être écrits différemment. Dans certaines circonstances, ils devraient certainement.

Cette comparaison des saveurs de regex indique que C♯ peut utiliser certaines des propriétés Unicode les plus simples. Si vous utilisez Unicode, vous devriez probablement utiliser la catégorie générale \p{L} pour toutes les lettres possibles, et peut-être \p{Nd} pour les nombres décimaux. De plus, si vous souhaitez accepter toute la ponctuation, pas seulement HYPHEN-MINUS, vous devez utiliser le \p{Pd} propriété. Vous voudrez peut-être aussi écrire cette séquence de caractères blancs simplement en tant que \s, en supposant que ce n’est pas trop général pour vous.

Tous ensemble, cela équivaut à un comportement de [\p{L}\p{Nd}\p{Pd}!$*] pour faire correspondre un caractère de cet ensemble.

De toute façon, j’utiliserai probablement cela, même si je n’avais pas prévu de traiter avec le jeu complet Unicode, car c’est une bonne habitude à prendre et parce que ces choses dépassent souvent leurs paramètres d’origine. Maintenant, lorsque vous le soulevez pour l'utiliser dans un autre code, il fonctionnera toujours correctement. Si vous codez tous les caractères en dur, ce ne sera pas le cas.

12
tchrist

Est-ce ce que vous recherchez?

MatchCollection matches = Regex.Matches(mystring, "-");
3
Aliostad

[-a-z0-9] +, [a-z0-9 -] +, [az-0-9] + ainsi que [az-0-9] + sont identiques. Le trait d'union entre deux plages considérées comme un symbole.Et aussi [a-z0-9 - + ()] + cette expression régulière permettent un trait d'union.

3
Parimala

utilisez "\ p {Pd}" sans les guillemets pour rechercher tout type de trait d'union. Le caractère '-' n'est qu'un type de trait d'union qui se trouve être également un caractère spécial dans Regex.

1
Radu Simionescu