web-dev-qa-db-fra.com

Regex: Spécifiez "espace ou début de chaîne" et "espace ou fin de chaîne"

Imaginez que vous essayez de faire correspondre le motif "stackoverflow".

Vous voulez ce qui suit:

 this is stackoverflow and it rocks [MATCH]

 stackoverflow is the best [MATCH]

 i love stackoverflow [MATCH]

 typostackoverflow rules [NO MATCH]

 i love stackoverflowtypo [NO MATCH]

Je sais comment analyser stackoverflow s'il existe des espaces sur les deux sites en utilisant:

/\s(stackoverflow)\s/

Idem avec si c'est au début ou à la fin d'une chaîne:

/^(stackoverflow)\s/

/\s(stackoverflow)$/

Mais comment spécifier "espace ou fin de chaîne" et "espace ou début de chaîne" en utilisant une expression régulière?

108
anonymous-one

Vous pouvez utiliser l'un des éléments suivants:

\b      #A Word break and will work for both spaces and end of lines.
(^|\s)  #the | means or. () is a capturing group. 


/\b(stackoverflow)\b/

De plus, si vous ne souhaitez pas inclure d'espace dans votre match, vous pouvez utiliser lookbehind/aheads.

(?<=\s|^)         #to look behind the match
(stackoverflow)   #the string you want. () optional
(?=\s|$)          #to look ahead.
143
Jacob Eggers

(^|\s) correspondrait à l’espace ou au début de la chaîne et ($|\s) pour l'espace ou la fin de la chaîne. Ensemble c'est:

(^|\s)stackoverflow($|\s)
54
gordy

Voici ce que j'utiliserais:

 (?<!\S)stackoverflow(?!\S)

En d'autres termes, faites correspondre "stackoverflow" s'il n'est pas précédé par un caractère autre qu'un espace et non suivi par un caractère autre qu'un espace.

C’est mieux (IMO) que l’approche "espace-ou-ancre", et cela ne suppose pas que la chaîne commence et finit avec des caractères Word comme le \b approche fait.

13
Alan Moore

\b correspond aux limites de Word (sans faire correspondre réellement les caractères), les éléments suivants doivent faire ce que vous voulez:

\bstackoverflow\b
7
Andrew Clark