Actions

Using regular expressions/fr: Difference between revisions

From LimeSurvey Manual

(Updating to match new version of source page)
(Updating to match new version of source page)
(18 intermediate revisions by 2 users not shown)
Line 2: Line 2:
__TOC__
__TOC__


Regular Expressions must start and finish with a forward slash ("/"). You can find a good library of regular expressions at http://www.regexlib.net/. These patterns will almost all work if surrounded with the forward slash.
<div class="mw-translate-fuzzy">


To test your regex you can [https://regex101.com/ use this regex tester].
<div class="simplebox">La traduction de cette page n'est pas terminée.</div>


''Please add successfully tested regular expressions!''
__TOC__
 
=#Validation=
 
Lorsque vous définissez les attributs d'une question, vous devez indiquer son code, le texte de la question, le type de question,
 
le nombre minimum et/ou maximum de caractères, etc.
 
Cependant, il n'est pas possible définir tous les attributs de contrôle pouvant satisfaire les besoins des utilisateurs de LimeSurvey.
 
La zone de saisie ''Validation'' de l'écran d'édition d'une question joue ce rôle et permet d'ajouter des contrôles supplémentaires sur la réponse.
 
Ces contrôles se font gr&acirc;ce à des expressions régulières que l'on place dans la zone de saisie ''Validation''.
 
[[File:LimeSurvey-2011-06-01-19-18.png]]
 
Dans la situation présentée ci-dessus, la réponse sera considérée comme valide si d'une part elle est composée uniquement de lettres
 
en majuscule et d'autre part si le nombre de lettres est compris entre 1 et 10.
 
<div class="simplebox"><u>Attention</u>
 
Pour le contenu de la zone de saisie ''Validation'' soit évalué, il faut obligatoirement que l'utilisateur est saisi un caractère.
 
</div>
 
=#Bref rappel=
 
<div class="simplebox"><u>Avertissements</u>
 
L'objet de cette section n'est pas d'expliquer comment constituer des expressions régulières
 
ou bien d'expliquer leurs fonctionnements.
 
De très bons livres le font comme Maîtrise des expressions régulières de Jeffrey E. F. Friedl.
 
Il y a également des sites qui traitent de ces sujets comme  http://www.regxlib.net/ (en anglais)
 
ou bien http://perl.enstimac.fr/DocFr/perlrequick.html (en français).</div>
 
L'expression régulière est un moyen puissant,flexible et efficace d'appliquer un traitement sur du texte.
 
Gr&acirc;ce à une notation générale (motif, pattern), c'est une sorte de mini-langage de programmation qui permet de décrire
 
et d'analyser le texte. Plusieurs notations existent.
 
Celle utilisée dans LimeSurvey est du type PERL et doivent commencer et se terminer par le caractère slash ("/").
 
{|
|   Métacaractère||   Signification||
|-
|   .||   n'importe quel caractère sauf \n||
|-
|   <nowiki>[</nowiki>  ]|| tous les caractères énumérés  ||   <nowiki>[</nowiki>abc]
|-
|   <nowiki>[</nowiki>~94~  ]|| tous les caractères sauf ceux qui sont énumérés  ||   <nowiki>[</nowiki>~94~abc]
|-
|   ~124~ || tous les caractères sauf ceux qui sont énumérés  ||   mot1~124~mot2~124~mot3
|-
|   - || intervalle  ||   a-z
|-
|
|}
 
{|
|   Quantificateur||   Signification   || Exemple
|-
|   * ||   zéro ou plus  || A* = zéro ou plus de lettre A
|-
|   + || 1 ou plus       || A+ = une lettre A ou plus
|-
|   ? || 0 ou 1          || A? = pas de lettre A ou une seule lettre A
|-
| {n} || n fois exactement || A{3} = trois lettres A
|-
|{min,} || minimum min fois et plus || A{3,} trois lettres A ou plus
|-
|{min,max}|| minimum min et maximum max  fois || A{3,7} trois lettres A au minimum et au maximum 7 lettres A
|-
|
|}
 
{|
|   Caractères||   Signification || Équivalence
|-
| \n || nouvelle ligne||
|-
| \r || retour à la ligne||
|-
| \t || tabulation||
|-
| \v || tabulation vertical||
|-
| \f || nouvelle page||
|-
|   \s ||   caractères d'espacement|| <nowiki>[</nowiki>\n\r\t\f]
|-
|   \S || tous les caractères sauf les caractères d'espacement|| <nowiki>[</nowiki>~94~\n\r\t\f]
|-
|   \d || les chiffres||<nowiki>[</nowiki>0-9]
|-
| \D || tous les caractères sauf les chiffres||<nowiki>[</nowiki>~94~0-9]
|-
| \w || caractère constituant un mot||<nowiki>[</nowiki>0-9a-zA-Z_]
|-
| \W || tous les caractères ne constituant pas un mot||<nowiki>[</nowiki>~94~\w]
|-
| \xhh || caractère en hexadécimal(hh) ex: \x41 = A||
|-
|
|}
 
{|
|   Modificateur||   Signification
|-
| i || ignore la casse
|-
| x || le point reconnait aussi \n
|-
| m || mode multi lignes
|-
|
|}
 
Les modificateurs se mettent après le dernier slash ex : /<nowiki>[</nowiki>a-z]/i est équivalent à /<nowiki>[</nowiki>a-zA-Z]/
 
Vous pouvez tester vos expressions régulières sur http://www.spaweditor.com/scripts/regex/index.php
 
=#Quelques exemples=
 
<div class="simplebox">''Vous pouvez ajouter des expressions régulières mais testées auparavant!''</div>
 
Exemples (notez qu'elles sont toutes sur une seule ligne):
 
==Validation d'un code postal français==
 
<nowiki>/^0[1-9]|[1-8][0-9]|9[0-8]|2A|2B[0-9]{3}$/</nowiki>
 
Cette expression teste seulement de le format du code postal mais pas de sa validité.
 
==Validation du numéro de département français==
 
<nowiki>/^0[1-9]|[1-8][0-9]|9[0-8]|2A|2B$/</nowiki>
 
Cette expression teste seulement de le format du numéro du département mais pas de sa validité.
 
==Validation d'un nombre==
 
===Validation d'un nombre entier===
 
====nombre entier compris dans un intervalle défini (age, etc.) de 20 à 99====
 
<nowiki>/([2-9][0-9])/</nowiki>
 
====nombre entier compris dans un intervalle défini (age, etc.) de 18 à 35====
 
<nowiki>/(1[8-9]|2[0-9]|3[0-5])/</nowiki>
 
====nombre entier compris dans un intervalle défini (age, etc.) de 19 à 65====
 
<nowiki><div class="simplebox">(1[8-9]|[2-5][0-9]|6[0-5])$</nowiki>
 
====nombre entier compris dans un intervalle de 1 à 99999====
 
<nowiki>/^([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9])$/</nowiki>  <nowiki>/^[1-9][0-9]{0,4}$/</nowiki>
 
C'est deux expressions produisent le même résultat.
 
====nombre entier compris dans plusieurs intervalles de 1 à 999, de 1.000 à 999.999====
 
<nowiki>/^[1-9][0-9]{0,2}(?:\.[0-9]{3}){0,1}$/</nowiki>
 
====validation d'un score compris entre 1 et 10====
 
<nowiki>/^[1-9]{1}$|^10$/</nowiki>
 
====validation d'un score compris entre 1 et 100====
 
<nowiki>/^[1-9]?[0-9]{1}$|^100$/</nowiki>
 
===validation d'un nombre décimal===
 
Ce type de validation peut être utilisé dans le cas de prix, mesure
 
====validation d'un nombre décimal====
 
<nowiki>/^([1][0-9][0-9]|[1-9][0-9]|[0-9])[[\.)[0-9][0-9])?$/</nowiki>
 
les nombres entre ayant une partie décimale optionnelle à deux chiffres
 
  <nowiki>/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/</nowiki>
 
===Monnaie===
 
====Euro (le signe Euro et les centimes sont optionnels)====
 
  <nowiki>/^\d+(\.(\d{3}]]?&euro;?$/</nowiki>
 
====Dollar US====
 
<nowiki>/^\$?\d+(\.(\d{2}))?$/</nowiki>
 
Le signe dollar en début de saisie et les cents sont optionnels.
 
====Prix en Franc Suisse====
 
C'est un nombre avec deux décimales  après la virgule dont le dernier chiffre est soit 5, soit 0.
 
<nowiki>/^(\d+)(\.\d(05)?)?$/</nowiki>
 
==Validation d'une date==
 
====validation d'une date au format jj/mm/aaaa====
 
<nowiki>/^\d{1,2}\/\d{1,2}\/\d{4}$/</nowiki>
 
====validation d'une date au format jj/mm/aaaa du 20 ou 21éme siècle====
 
<nowiki>/^\d{1,2}\/\d{1,2}\/(19|20)\d{2}$/</nowiki> a tester
 
====validation d'un mois (1-12)====
 
<nowiki>/^[0]?[1-9]$|^1[0-2]$/</nowiki>
 
Cette expression permet de saisir le mois de janvier soit 1, soit 01.
 
==Validation d'une heure==
 
<nowiki>/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/</nowiki>
 
cette expression permet de valider un format d'heure HH:MM ex : 11:32
 
<nowiki>/^(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?$/</nowiki>
 
Cette expression permet de valider un format d'heure HH:MM:SS où la partie de secondes est optionnelle ex : 11:32:53 ou bien 11:32
 
<nowiki>/^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/</nowiki>
 
Cette expression permet de valider un format d'heure HH:MM:SS où la partie des secondes est obligatoire ex : 11:32:53
 
==Validation d'une longueur de saisie==
 
Pour certain type de question, LimeSurvey propose dans les paramètres avancés ce type de contrôle.
 
====validation d'une longueur de saisie minimum====
 
<nowiki>/^.{3,}$/</nowiki>
 
ici la longueur minimum est de 3 caractères quelconques
 
====validation d'une longueur de saisie maximum====
 
<nowiki>/^.{3,}$/</nowiki>
 
ici la longueur maximum est de 3 caractères quelconques
 
==Validation de texte==
 
Actuellement, le type de question ''Multiples zones de texte court'' ne permet pas de contrôler le minimum ou le maximum de réponses.
 
Une des manières d'y parvenir est d'utiliser le type question ''Zone de texte long'' sur laquelle on appliquera une expression régulière.
 
L'expression ci-dessous vérifie qu'il y a au moins un mot par ligne et qu'il y a au moins trois lignes mais pas plus de 10 lignes :
 
<nowiki>/(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+)*)){2,10}/is</nowiki>
 
Si vous voulez vérifier qu'il y a au moins 5 mots par ligne, vous devez changer le premier et le dernier caractère étoile (*) par {4,}
 
<nowiki>/(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+){4,})(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+){4,})){2,10}/is</nowiki>
 
Si voulez 1 ou plusieurs mots par ligne et de 1 à 5 lignes, vous pouvez changer les valeurs du quantificateur {0,4}.
 
<nowiki>/(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+)*)){0,4}/is</nowiki>
 
===Limiter le nombre de mots===
 
L'expression ci-dessous permet d'écrire au minimum 1 mot et au maximum 200 mots.
 
<nowiki>/^[-\w]+(?:\W+[-\w]+){0,199}\W*$/</nowiki>
 
Vous pouvez varier le minimum et le maximum selon vos besoins en changeant {0,199} ( voir ci-dessus le tableau ''Quantificateur'')
 
==Validation d'un mot==
 
==== mot dans une liste====
 
<nowiki>/^(arbre|feuille|fleur){1}$/</nowiki>
 
Le mot saisie doit correspondre exactement (minuscule) au mot dans la liste.
 
====validation du mot dans une liste====
 
<nowiki>/^(arbre|feuille|fleur){1}$/i</nowiki>
 
Ici, on ne tient pas compte des minuscules et des majuscules : Les mots suivants Arbre,arbre, ARBRE, ArBrE, etc. sont tous valides.
</div>
 
Pour tester vos expressions régulières vous pouvez utiliser ces testeurs d'expressions régulières: [https://regex101.com/ regex101] [https://extendsclass.com/regex-tester.html regex tester]
 
{{Note|To improve this wiki section, we kindly ask you to add your successfully tested regular expression(s) to provide a better understanding of this feature to the new LimeSurvey (potential) users.}}
 
{{Alert|title=Attention|text= Please note that all the below examples are written on one line!}}


Examples (note that these are all one line):


=Important: Regular Expressions in conditions=
=Important: Regular Expressions in conditions=


Note that when using regular expressions in the condition editor, do NOT include the beginning and ending slash.
Note that when using regular expressions in the condition editor, do NOT include the beginning and ending slash.


=Email validation=


<source>
<div class="mw-translate-fuzzy">
=#Validation=
</div>
 
 
Update (12/2018): Since these days domain names cannot only hold special characters like “ü” but also use more than 3 characters as domain name like .''tech'' or .''company'', the below email regex only checks if “@” and “.” exists within the entered email address.
<source lang="html">
/^.+?@.+?\..+$/
</source>
 
If you want to validate one address per line, in a multiline long text field:
<source lang="html">
/^(((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*(\r\n)?\n?)+)*)$/
</source>
 
At this outdated regex the domain name is limited to 3 characters which doesn't cover all available domains:
<source lang="html">
/^(\w[-._+\w]*\w@\w[-._\w]*\w\.\w{2,3})$/
/^(\w[-._+\w]*\w@\w[-._\w]*\w\.\w{2,3})$/
</source>
</source>


=Postcodes=
Codes postaux
 
== Codes postaux australiens: ==
 
<source lang="html">/^[0-9]{4}/</source>
 
== Codes postaux brésiliens ==
 
<source lang="html">/^[0-9]{2}\.[0-9]{3}-[0-9]{3}$/</source>
 
== Codes postaux canadiens ==
 
<source lang="html">/^[a-zA-Z]\d{1}[a-zA-Z](\-| |)\d{1}[a-zA-Z]\d{1}$/</source>
 
== Codes postaux américains ==


==Australian postcodes:==
<source lang="html">/^[0-9]{5}([- /]?[0-9]{4})?$/</source>


<source>/^[0-9]{4}/</source>
For the postal code to start with zero, use:


==Brazilian postcodes==
<source lang="html">/^[0-9]{5}(?:-[0-9]{4})?$/</source>


<source>/^[0-9]{2}\.[0-9]{3}-[0-9]{3}$/</source>
== Codes postaux britanniques ==


==Canadian postcodes==
<source lang="html">/^[A-Z][A-Z]?[0-9][A-Z0-9]? ?[0-9][ABDEFGHJLNPQRSTUWXYZ]{2}$/i</source>


<source>/^[a-zA-Z]\d{1}[a-zA-Z](\-| |)\d{1}[a-zA-Z]\d{1}$/</source>
Notez que ceci n'est pas très exact et qu'une validation précise est beaucoup plus complexe. Par exemple, voir [https://stackoverflow.com/questions/164979/uk-postcode-regex-comprehensive StackOverflow answer] et [https://en.wikipedia.org/wiki/Talk:Postcodes_in_the_United_Kingdom#Regular_Expressions Wikipedia] pour plus informations.


==US postal codes==
== Codes postaux français ==  


<source>/^[0-9]{5}([- /]?[0-9]{4})?$/</source>
<source lang="html">/(^[0-8]\d\d{3}$)|(^9[0-5]\d{3}$)|(^97[1-6]\d{2}$)|(^98[46-8]\d{2}$)/</source>


==UK postcodes==
L'expression ci-dessus est très précise et permettra de vérifier l'existence ou non du département français (deux premiers chiffres), y compris les départements et territoires d'outre-mer (DOM-TOM).


<source>/^[A-Z][A-Z]?[0-9][A-Z0-9]? ?[0-9][ABDEFGHJLNPQRSTUWXYZ]{2}$/i</source>


Note that this is not very exact, and a more exact validation is much more complex.  For example, see [http://stackoverflow.com/questions/164979/uk-postcode-regex-comprehensive StackOverflow answer] and [http://en.wikipedia.org/wiki/Talk:Postcodes_in_the_United_Kingdom#Regular_Expressions Wikipedia] for more information.
=Numéros de téléphone=


=Phone numbers=


==US phone numbers==
==US phone numbers==


<source>/^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$/</source>
<source lang="html">/^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$/</source>


or
or


  <source>/^[\(\)\.\- ]{0,}[0-9]{3}[\(\)\.\- ]{0,}[0-9]{3}[\(\)\.\- ]{0,}[0-9]{4}[\(\)\.\- ]{0,}$/</source>
  <source lang="html">/^[\(\)\.\- ]{0,}[0-9]{3}[\(\)\.\- ]{0,}[0-9]{3}[\(\)\.\- ]{0,}[0-9]{4}[\(\)\.\- ]{0,}$/</source>


This second option will match all phone Canadian and US phone numbers that include non-digit symbols including
This second option will match all phone Canadian and US phone numbers that include non-digit symbols including:


  <source> . ( ) - (space)</source>
  <source lang="html"> . ( ) - (space)</source>


This will allow you to match phone numbers which resemble below.
This will allow you to match phone numbers which resemble below:
*(555)555 5555
*(555)555 5555
*555.555.5555
*555.555.5555
Line 68: Line 396:
==Australian phone numbers==
==Australian phone numbers==


The following patterns match all various Australian mobile and landline phone numbers including with "+61" country prefix eg:
The following patterns match all various Australian mobile and landline phone numbers including with "+61" country prefix:
*(02) 9123 6535
*(02) 9123 6535
*03 1234-5345
*03 1234-5345
Line 90: Line 418:
Very precise:
Very precise:


<source>/^\(?(?:\+?61|0)(?:(?:2\)?[ -]?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])|3\)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])|7\)?[ -]?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)|8\)?[ -]?(?:5[ -]?[1-4]|6[ -]?[0-8]|[7-9][ -]?[0-9]))(?:[ -]?[0-9]){6}|4\)?[ -]?(?:(?:[01][ -]?[0-9]|2[ -]?[0-57-9]|3[ -]?[1-9]|4[ -]?[7-9]|5[ -]?[018])[ -]?[0-9]|3[ -]?0[ -]?[0-5])(?:[ -]?[0-9]){5})$/
<source lang="html">/^\(?(?:\+?61|0)(?:(?:2\)?[ -]?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])|3\)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])|7\)?[ -]?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)|8\)?[ -]?(?:5[ -]?[1-4]|6[ -]?[0-8]|[7-9][ -]?[0-9]))(?:[ -]?[0-9]){6}|4\)?[ -]?(?:(?:[01][ -]?[0-9]|2[ -]?[0-57-9]|3[ -]?[1-9]|4[ -]?[7-9]|5[ -]?[018])[ -]?[0-9]|3[ -]?0[ -]?[0-5])(?:[ -]?[0-9]){5})$/
</source>
</source>


Not very precise:
Not very precise:


<source>/^(?:\+?61|0)[2-478](?:[ -]?[0-9]){8}$/</source>
<source lang="html">/^(?:\+?61|0)[2-478](?:[ -]?[0-9]){8}$/</source>


===All Australian phone numbers (landlines only - area code required)===
===All Australian phone numbers (landlines only - area code required)===
Line 102: Line 429:
Very precise:
Very precise:


<source>/^\(?(?:\+?61|0)(?:2\)?[ -]?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])|3\)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])|7\)?[ -]?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)|8\)?[ -]?(?:5[ -]?[1-4]|6[ -]?[0-8]|[7-9][ -]?[0-9]))(?:[ -]?[0-9]){6}$/</source>
<source lang="html">/^\(?(?:\+?61|0)(?:2\)?[ -]?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])|3\)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])|7\)?[ -]?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)|8\)?[ -]?(?:5[ -]?[1-4]|6[ -]?[0-8]|[7-9][ -]?[0-9]))(?:[ -]?[0-9]){6}$/</source>
 


Not very precise:
Not very precise:


<source>/^(?:\+?61|\(?0)[2378]\)?(?:[ -]?[0-9]){8}$/</source>
<source lang="html">/^(?:\+?61|\(?0)[2378]\)?(?:[ -]?[0-9]){8}$/</source>


===New South Wales landline phone numbers (area code optional)===
===New South Wales landline phone numbers (area code optional)===
Line 113: Line 439:
Very precise:
Very precise:


<source>/^(?:\(?(?:\+?61|0)2\)?[ -]?)?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])(?:[ -]?[0-9]){6}$/</source>
<source lang="html">/^(?:\(?(?:\+?61|0)2\)?[ -]?)?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])(?:[ -]?[0-9]){6}$/</source>


Not very precise:
Not very precise:


<source>/^(?:\(?(?:\+?61|0)2\)?(?:[ -]?[0-9]){7}[0-9]$/</source>
<source lang="html">/^(?:\(?(?:\+?61|0)2\)?(?:[ -]?[0-9]){7}[0-9]$/</source>


===Victorian and Tasmanian landline phone numbers (area code optional)===
===Victorian and Tasmanian landline phone numbers (area code optional)===
Line 123: Line 449:
Very precise:
Very precise:


<source>/^(?:\(?(?:\+?61|0)3\)?[ -]?)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])(?:[ -]?[0-9]){6}$/</source>
<source lang="html">/^(?:\(?(?:\+?61|0)3\)?[ -]?)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])(?:[ -]?[0-9]){6}$/</source>


Not very precise:
Not very precise:


<source>/^(?:\(?(?:\+?61|0)3\)?(?:[ -]?[0-9]){7}[0-9]$/</source>
<source lang="html">/^(?:\(?(?:\+?61|0)3\)?(?:[ -]?[0-9]){7}[0-9]$/</source>


===Queensland landline phone numbers (area code optional)===
===Queensland landline phone numbers (area code optional)===
Line 133: Line 459:
Very precise:
Very precise:


<source>/^(?:\(?(?:\+?61|0)7\)?[ -]?)?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)(?:[ -]?[0-9]){6}$/</source>
<source lang="html">/^(?:\(?(?:\+?61|0)7\)?[ -]?)?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)(?:[ -]?[0-9]){6}$/</source>
 


Not very precise:
Not very precise:


<source>/^(?:\(?(?:\+?61|0)7\)?(?:[ -]?[0-9]){7}[0-9]$/</source>
<source lang="html">/^(?:\(?(?:\+?61|0)7\)?(?:[ -]?[0-9]){7}[0-9]$/</source>


===South Australia, Northern Territory, Western Australia landline phone numbers (area code optional)===
===South Australia, Northern Territory, Western Australia landline phone numbers (area code optional)===
Line 144: Line 469:
Very precise:
Very precise:


<source>/^(?:\(?(?:\+?61|0)8\)?[ -]?)?(?:5[1-4]|6[0-8]|[7-9][0-9])$/</source>
<source lang="html">/^(?:\(?(?:\+?61|0)8\)?[ -]?)?(?:5[1-4]|6[0-8]|[7-9][0-9])$/</source>


Not very precise:
Not very precise:


<source>/^(?:\(?(?:\+?61|0)8\)?(?:[ -]?[0-9]){7}[0-9]$/</source>
<source lang="html">/^(?:\(?(?:\+?61|0)8\)?(?:[ -]?[0-9]){7}[0-9]$/</source>


===Australian mobile phone numbers only===
===Australian mobile phone numbers only===
Line 154: Line 479:
Very precise:
Very precise:


<source>/^(?:\+?61|0)4 ?(?:(?:[01] ?[0-9]|2 ?[0-57-9]|3 ?[1-9]|4 ?[7-9]|5 ?[018]) ?[0-9]|3 ?0 ?[0-5])(?: ?[0-9]){5}$/</source>
<source lang="html">/^(?:\+?61|0)4 ?(?:(?:[01] ?[0-9]|2 ?[0-57-9]|3 ?[1-9]|4 ?[7-9]|5 ?[018]) ?[0-9]|3 ?0 ?[0-5])(?: ?[0-9]){5}$/</source>
 


Not very precise:
Not very precise:


<source>/^(?:\(?(?:\+?61|0)4\)?(?:[ -]?[0-9]){7}[0-9]$/</source>
<source lang="html">/^(?:\(?(?:\+?61|0)4\)?(?:[ -]?[0-9]){7}[0-9]$/</source>


==Belgian phone number==
==Belgian phone number==
  <source>/^((\+|00)32\s?|0)(\d\s?\d{3}|\d{2}\s?\d{2})(\s?\d{2}){2}$/</source>
  <source lang="html">/^((\+|00)32\s?|0)(\d\s?\d{3}|\d{2}\s?\d{2})(\s?\d{2}){2}$/</source>
==Belgian mobile phone number==
==Belgian mobile phone number==
  <source>/^((\+|00)32\s?|0)4(60|[789]\d)(\s?\d{2}){3}$/</source>
  <source lang="html">/^((\+|00)32\s?|0)4(60|[789]\d)(\s?\d{2}){3}$/</source>
==French phone number==
==French phone number==
  <source>/^((\+|00)33\s?|0)[1-5](\s?\d{2}){4}$/</source>
  <source lang="html">/^((\+|00)33\s?|0)[1-59](\s?\d{2}){4}$/</source>
==French mobile phone number==
==French mobile phone number==
  <source>/^((\+|00)33\s?|0)[679](\s?\d{2}){4}$/</source>
  <source lang="html">/^((\+|00)33\s?|0)[67](\s?\d{2}){4}$/</source>
==Luxemburg phone number==
==Luxemburg phone number==
  <source>/^((\+|00\s?)352)?(\s?\d{2}){3,4}$/</source>
  <source lang="html">/^((\+|00\s?)352)?(\s?\d{2}){3,4}$/</source>
==Luxemburg mobile phone number==
==Luxemburg mobile phone number==
  <source>/^((\+|00\s?)352)?\s?6[269]1(\s?\d{3}){2}$/</source>
  <source lang="html">/^((\+|00\s?)352)?\s?6[269]1(\s?\d{3}){2}$/</source>
=German marks (with optional plus or minus)=
=German marks (with optional plus or minus)=
  <source>/^[1-6]{1}[\+|\-]?$/</source>
  <source lang="html">/^[1-6]{1}[\+|\-]?$/</source>
 
 
=Age validation=
=Age validation=
Example: Age 20-99
Example: Age 20-99
  <source>/([2-9][0-9])/</source>
  <source lang="html">/([2-9][0-9])/</source>
 
Example: Age 18-35
<source lang="html">/(1[8-9]|2[0-9]|3[0-5])/</source>


Example: Age 19-65
<source lang="html">/^(1[8-9]|[2-5][0-9]|6[0-5])$/</source>


Example: Age 18-35
<source>/(1[8-9]|2[0-9]|3[0-5])/</source>


=Number validation=


Example: Age 19-65
<source>/^(1[8-9]|[2-5][0-9]|6[0-5])$/</source>


=Number validation=
==Numbers from 1 to 99999==
==Numbers from 1 to 99999==
  <source>/^([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9])$/</source>
  <source lang="html">/^([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9])$/</source>
  <source>/^[1-9][0-9]{0,4}$/ does the same as above but should run a little faster</source>
  <source lang="html">/^[1-9][0-9]{0,4}$/ does the same as above but should run a little faster</source>
==Numbers from 1 to 999, 1.000 to 999.999 to 999.999.999==
==Numbers from 1 to 999, 1.000 to 999.999 to 999.999.999==
  <source>/^[1-9][0-9]{0,2}(?:\.[0-9]{3}){0,2}$/</source>
  <source lang="html">/^[1-9][0-9]{0,2}(?:\.[0-9]{3}){0,2}$/</source>
Accepts numbers from 1 to 999, 1.000 to 999.999 to 999.999.999 but
Accepts numbers from 1 to 999, 1.000 to 999.999 to 999.999.999 but
rejects numbers like 999.1.1 , 94.22.22, 999.1.22, 999.11.1, 999.1.333
rejects numbers like 999.1.1 , 94.22.22, 999.1.22, 999.11.1, 999.1.333
Line 198: Line 527:
==Number validation with optional decimal (for price)==
==Number validation with optional decimal (for price)==
Accepts numbers from 0 to 199, with 2 decimal optional:
Accepts numbers from 0 to 199, with 2 decimal optional:
  <source>/^([1][0-9][0-9]|[1-9][0-9]|[0-9])((\.)[0-9][0-9])?$/</source>
  <source lang="html">/^([1][0-9][0-9]|[1-9][0-9]|[0-9])((\.)[0-9][0-9])?$/</source>


==Number validation with thousand separator==
Space as separator, no minus
<source lang="html">/^(?!0)\d{1,3}(\ \d{3})*$/</source>
Dot as separator, minus allowed
<source lang="html">/^-?(?!0)\d{1,3}(\.\d{3})*$/</source>


Forces two decimal points and accepts numbers from 1.00 to 999,999,999.00 with an optional comma delimiting thousands/millions
It forces two decimal points and accepts numbers from 1.00 to 999,999,999.00 with an optional comma delimiting thousands/millions
including all of the following: 1.00, 1,000.00, 12,345.67, 12345,02, 123,456,468.00, 1234566.00, 123456789.00
including all of the following: 1.00, 1,000.00, 12,345.67, 12345,02, 123,456,468.00, 1234566.00, 123456789.00
but not 1,23.00, 12,3.4 or 1234,43.04
but not 1,23.00, 12,3.4 or 1234,43.04
  <source>/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/</source>
  <source lang="html">/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/</source>
   
   
Similar to the above: Forces two decimal points but accepts a "0" before decimal separator ",".
Similar to the above: Forces two decimal points but accepts a "0" before decimal separator ",".
  <source>/[0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/</source>
  <source lang="html">/[0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/</source>


Same as above but the two decimal points are optional:
Same as above, but the two decimal points are optional:
<source>/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}(?:\.[0-9]{2})?$/ </source>
<source lang="html">/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}(?:\.[0-9]{2})?$/ </source>


==Month (1-12)==
==Month (1-12)==
Line 216: Line 550:
If you want to ask for the month a person was born you can validate the input as follows:
If you want to ask for the month a person was born you can validate the input as follows:


  <source>/^[0]*[1-9]$|^[0]*1[0-2]$/</source>
  <source lang="html">/^[0]*[1-9]$|^[0]*1[0-2]$/</source>


=Minimum width (set to 3 in this example)=
=Minimum width (set to 3 in this example)=


  <source>/^.{3,}$/</source>
 
  <source lang="html">/^.{3,}$/</source>
 


=Currency=
=Currency=


==US currency (dollar sign and cents optional)==
==US currency (dollar sign and cents optional)==


  <source>/^\$?\d+(\.(\d{2}))?$/</source>
  <source lang="html">/^\$?\d+(\.(\d{2}))?$/</source>


Check for comma usage:
Check for comma usage:
<source>/^\$?\d{1,3}(\d+(?!,))?(,\d{3})*(\.\d{2})?$/</source>
<source lang="html">/^\$?\d{1,3}(\d+(?!,))?(,\d{3})*(\.\d{2})?$/</source>


==Swiss price==
==Swiss price==
Line 235: Line 572:
A number with two decimal numbers after the decimal point of which the last one is either a 5 or a 0:
A number with two decimal numbers after the decimal point of which the last one is either a 5 or a 0:


  <source>/^(\d+)(\.\d(05)?)?$/</source>
  <source lang="html">/^(\d+)(\.\d(05)?)?$/</source>
 


=Validate score=
=Validate score=


==1-10==
==1-10==


  <source>/^[1-9]{1}$|^10$/</source>
  <source lang="html">/^[1-9]{1}$|^10$/</source>


==1-100==
==1-100==


  <source>/^[1-9]?[0-9]{1}$|^100$/</source>
  <source lang="html">/^[1-9]?[0-9]{1}$|^100$/</source>
 


=Text validation=
=Text validation=


currently multiple short text doesn't support minimum or maximum answers. One way around this is to use a long free text type question with a regular expression.


The following test for at least one word per line for at least 3 lines and no more than 10 lines.
The [[Question type - Multiple short text|multiple short text question type]] doesn't support minimum or maximum answers at the moment. One way around this is to use a [[Question type - Long free text|long free text question type]] with a regular expression.
 
The below expression tests for at least one word per line for at least 3 lines and no more than 10 lines:


  <source>/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)){2,10}/is</source>
  <source lang="html">/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)){2,10}/is</source>


If you wanted, say five words per line you could change the first and last star/asterisk to {4,} e.g.
If you want, say five words per line, you could change the first and last star/asterisk to {4,}:


<source>/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+){4,})(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+){4,})){2,10}/is</source>
<source lang="html">/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+){4,})(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+){4,})){2,10}/is</source>


If you wanted one or more words per line on between 1 and 5 lines, you can change the content of the last curley braces to '''0,4''' (note you use 0 because you're already matching the first line).
If you wanted one or more words per line (between line 1 and line 5), you can change the content located within the last curly braces to '''0,4''' (note you use 0 because you're already matching the first line).


  <source>/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)){0,4}/is</source>
  <source lang="html">/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)){0,4}/is</source>


==Word count==
==Word count==


  <source>The following restricts the number of words allowed to a minimum of 1 and a maximum of 200
  The following restricts the number of words allowed to a minimum of 1 and a maximum of 200:


/^[-\w]+(?:\W+[-\w]+){0,199}\W*$/</source>
<source lang="html">/^[-\w]+(?:\W+[-\w]+){0,199}\W*$/</source>


  <source>To increase the minimum change the zero part of {0,199}
  To increase the minimum change the zero part of {0,199}.


To increase or decrease the maximum change the "199" part of {0,199}</source>
To increase or decrease the maximum change the "199" part of {0,199}.


=Time validation=
=Time validation=


There are a number of ways of writing time formats. Some of the possible options are 12 hour or 24 hour, with seconds or without. Although it is an option to use the date question type (it can also capture time) you can use "short free text" with one of the validation regular expressions below:


The following three validation strings test for 24 hour time (in order of appearences) without seconds, with optional seconds lastly with seconds required.
There are a number of ways to write time formats. Some of the possible options are 12 hour or 24 hour, with seconds or without. Although it is an option to use the [[Question type - Date|date question type]] (it can also capture time) you can use the [[Question type - Short free text|short free text question type]] with one of the below validation regular expressions.


<source>/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/</source>
The following three validation strings test for 24 hour time (in order of appearances) without seconds, with optional seconds lastly with seconds required:


<source>/^(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?$/</source>
<source lang="html">/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/</source>


<source>/^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/</source>
<source lang="html">/^(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?$/</source>


<source lang="html">/^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/</source>


The following three match 12 hour time, as above with seconds, optional seconds and with seconds required:


The following three match 12 hour time, as above with seconds, optional seconds and with seconds required
<source lang="html">/^(?">00:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9] (?:pm|PM))$/</source>


<source>/^(?">00:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9] (?:pm|PM))$/</source>
<source lang="html">/^(?:00:[0-5][0-9](?::[0-5][0-9])? (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9](?::[0-5][0-9])? (?:[ap]m|[AP]M)|12:[0-5][0-9](?::[0-5][0-9])? (?:pm|PM))$/</source>


<source>/^(?:00:[0-5][0-9](?::[0-5][0-9])? (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9](?::[0-5][0-9])? (?:[ap]m|[AP]M)|12:[0-5][0-9](?::[0-5][0-9])? (?:pm|PM))$/</source>
<source lang="html">/^(?:00:[0-5][0-9]:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9]:[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9]:[0-5][0-9] (?:pm|PM))$/</source>


<source>/^(?:00:[0-5][0-9]:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9]:[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9]:[0-5][0-9] (?:pm|PM))$/</source>
The following three match either 12 or 24 hour time as above with seconds, optional seconds and with seconds required:


<source lang="html">/^(?:(?:00:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9] (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9])$/</source>


<source lang="html">/^(?:(?:00:[0-5][0-9](?[0-5][0-9])? (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9](?[0-5][0-9])? (?:[ap]m|[AP]M)|12:[0-5][0-9](?[0-5][0-9])? (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9](?[0-5][0-9])?)$/</source>


The following three match either 12 or 24 hour time as above with seconds, optional seconds and with seconds required
<source lang="html">/^(?:(?:00:[0-5][0-9]:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9]:[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9]:[0-5][0-9] (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])$/</source>


<source>/^(?:(?:00:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9] (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9])$/</source>
=US states=


<source>/^(?:(?:00:[0-5][0-9](?[0-5][0-9])? (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9](?[0-5][0-9])? (?:[ap]m|[AP]M)|12:[0-5][0-9](?[0-5][0-9])? (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9](?[0-5][0-9])?)$/</source>


<source>/^(?:(?:00:[0-5][0-9]:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9]:[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9]:[0-5][0-9] (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])$/</source>
To validate for one state use the following (example is Texas):
*TX uppercase only: <source lang="html">/^(TX)$/</source>
*tx lowercase only: <source lang="html">/^(tx)$/</source>
*TX upper or lowercase: <source lang="html">/^([T|t][X|x])$/</source>


=US states=


To validate for one state use the following (example is Texas):
=Profanity Filter=
*TX uppercase only = <source>/^(TX)$/</source>
*tx lowercase only = <source>/^(tx)$/</source>
*TX upper or lowercase = <source>/^([T|t][X|x])$/</source>


=Profanity Filter=


To filter profanity words from an answer:
To filter profanity words from an answer:


  <source>/^(?i)((?!\bENTERPROFANITYHERE\b).)*$(?-i)/</source>
  <source lang="html">/^(?i)((?!\bENTERPROFANITYHERE\b).)*$(?-i)/</source>


Replace "ENTERPROFANITYHERE" with your bad word.
Replace "ENTERPROFANITYHERE" with your bad word.


The \b will allow passing of words such as "assassination" & "hello" if you enter "ass" or "hell" as your profanity word. This also works if you are trying to omit other words, names etc. from answers.
The \b will allow passing of words such as "assassination" and "hello" if you enter "ass" or "hell" as your profanity word. This also works if you are trying to omit other words, names etc. from answers.
 
 
=Helpful links=
 
 
In the beginning of this wiki section, we recommend you to use https://regex101.com/ to test/create regular expressions. You can also use https://www.regextester.com/ to create expressions in case you are unhappy about the first option. You can use https://extendsclass.com/regex-tester.html to visualize regular expressions.

Revision as of 14:58, 27 November 2022

La traduction de cette page n'est pas terminée.


#Validation

Lorsque vous définissez les attributs d'une question, vous devez indiquer son code, le texte de la question, le type de question,

le nombre minimum et/ou maximum de caractères, etc.

Cependant, il n'est pas possible définir tous les attributs de contrôle pouvant satisfaire les besoins des utilisateurs de LimeSurvey.

La zone de saisie Validation de l'écran d'édition d'une question joue ce rôle et permet d'ajouter des contrôles supplémentaires sur la réponse.

Ces contrôles se font grâce à des expressions régulières que l'on place dans la zone de saisie Validation.

Dans la situation présentée ci-dessus, la réponse sera considérée comme valide si d'une part elle est composée uniquement de lettres

en majuscule et d'autre part si le nombre de lettres est compris entre 1 et 10.

Attention

Pour le contenu de la zone de saisie Validation soit évalué, il faut obligatoirement que l'utilisateur est saisi un caractère.

#Bref rappel

Avertissements

L'objet de cette section n'est pas d'expliquer comment constituer des expressions régulières

ou bien d'expliquer leurs fonctionnements.

De très bons livres le font comme Maîtrise des expressions régulières de Jeffrey E. F. Friedl.

Il y a également des sites qui traitent de ces sujets comme  http://www.regxlib.net/ (en anglais)

ou bien http://perl.enstimac.fr/DocFr/perlrequick.html (en français).

L'expression régulière est un moyen puissant,flexible et efficace d'appliquer un traitement sur du texte.

Grâce à une notation générale (motif, pattern), c'est une sorte de mini-langage de programmation qui permet de décrire

et d'analyser le texte. Plusieurs notations existent.

Celle utilisée dans LimeSurvey est du type PERL et doivent commencer et se terminer par le caractère slash ("/").

  Métacaractère   Signification
  .   n'importe quel caractère sauf \n
  [  ] tous les caractères énumérés     [abc]
  [~94~  ] tous les caractères sauf ceux qui sont énumérés     [~94~abc]
  ~124~ tous les caractères sauf ceux qui sont énumérés     mot1~124~mot2~124~mot3
  - intervalle     a-z
  Quantificateur   Signification   Exemple
  *   zéro ou plus   A* = zéro ou plus de lettre A
  + 1 ou plus       A+ = une lettre A ou plus
  ? 0 ou 1           A? = pas de lettre A ou une seule lettre A
{n} n fois exactement A{3} = trois lettres A
{min,} minimum min fois et plus A{3,} trois lettres A ou plus
{min,max} minimum min et maximum max  fois A{3,7} trois lettres A au minimum et au maximum 7 lettres A
  Caractères   Signification Équivalence
\n nouvelle ligne
\r retour à la ligne
\t tabulation
\v tabulation vertical
\f nouvelle page
  \s   caractères d'espacement [\n\r\t\f]
  \S tous les caractères sauf les caractères d'espacement [~94~\n\r\t\f]
  \d les chiffres [0-9]
\D tous les caractères sauf les chiffres [~94~0-9]
\w caractère constituant un mot [0-9a-zA-Z_]
\W tous les caractères ne constituant pas un mot [~94~\w]
\xhh caractère en hexadécimal(hh) ex: \x41 = A
  Modificateur   Signification
i ignore la casse
x le point reconnait aussi \n
m mode multi lignes

Les modificateurs se mettent après le dernier slash ex : /[a-z]/i est équivalent à /[a-zA-Z]/

Vous pouvez tester vos expressions régulières sur http://www.spaweditor.com/scripts/regex/index.php

#Quelques exemples

Vous pouvez ajouter des expressions régulières mais testées auparavant!

Exemples (notez qu'elles sont toutes sur une seule ligne):

Validation d'un code postal français

/^0[1-9]|[1-8][0-9]|9[0-8]|2A|2B[0-9]{3}$/

Cette expression teste seulement de le format du code postal mais pas de sa validité.

Validation du numéro de département français

/^0[1-9]|[1-8][0-9]|9[0-8]|2A|2B$/

Cette expression teste seulement de le format du numéro du département mais pas de sa validité.

Validation d'un nombre

Validation d'un nombre entier

nombre entier compris dans un intervalle défini (age, etc.) de 20 à 99

/([2-9][0-9])/

nombre entier compris dans un intervalle défini (age, etc.) de 18 à 35

/(1[8-9]|2[0-9]|3[0-5])/

nombre entier compris dans un intervalle défini (age, etc.) de 19 à 65

<div class="simplebox">(1[8-9]|[2-5][0-9]|6[0-5])$

nombre entier compris dans un intervalle de 1 à 99999

/^([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9])$/  /^[1-9][0-9]{0,4}$/

C'est deux expressions produisent le même résultat.

nombre entier compris dans plusieurs intervalles de 1 à 999, de 1.000 à 999.999

/^[1-9][0-9]{0,2}(?:\.[0-9]{3}){0,1}$/

validation d'un score compris entre 1 et 10

/^[1-9]{1}$|^10$/

validation d'un score compris entre 1 et 100

/^[1-9]?[0-9]{1}$|^100$/

validation d'un nombre décimal

Ce type de validation peut être utilisé dans le cas de prix, mesure

validation d'un nombre décimal

/^([1][0-9][0-9]|[1-9][0-9]|[0-9])[[\.)[0-9][0-9])?$/
les nombres entre ayant une partie décimale optionnelle à deux chiffres
 /^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/
===Monnaie===
====Euro (le signe Euro et les centimes sont optionnels)====
 /^\d+(\.(\d{3}]]?€?$/

Dollar US

/^\$?\d+(\.(\d{2}))?$/

Le signe dollar en début de saisie et les cents sont optionnels.

Prix en Franc Suisse

C'est un nombre avec deux décimales  après la virgule dont le dernier chiffre est soit 5, soit 0.

/^(\d+)(\.\d(05)?)?$/

Validation d'une date

validation d'une date au format jj/mm/aaaa

/^\d{1,2}\/\d{1,2}\/\d{4}$/

validation d'une date au format jj/mm/aaaa du 20 ou 21éme siècle

/^\d{1,2}\/\d{1,2}\/(19|20)\d{2}$/ a tester

validation d'un mois (1-12)

/^[0]?[1-9]$|^1[0-2]$/

Cette expression permet de saisir le mois de janvier soit 1, soit 01.

Validation d'une heure

/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/

cette expression permet de valider un format d'heure HH:MM ex : 11:32

/^(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?$/

Cette expression permet de valider un format d'heure HH:MM:SS où la partie de secondes est optionnelle ex : 11:32:53 ou bien 11:32

/^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/

Cette expression permet de valider un format d'heure HH:MM:SS où la partie des secondes est obligatoire ex : 11:32:53

Validation d'une longueur de saisie

Pour certain type de question, LimeSurvey propose dans les paramètres avancés ce type de contrôle.

validation d'une longueur de saisie minimum

/^.{3,}$/

ici la longueur minimum est de 3 caractères quelconques

validation d'une longueur de saisie maximum

/^.{3,}$/

ici la longueur maximum est de 3 caractères quelconques

Validation de texte

Actuellement, le type de question Multiples zones de texte court ne permet pas de contrôler le minimum ou le maximum de réponses.

Une des manières d'y parvenir est d'utiliser le type question Zone de texte long sur laquelle on appliquera une expression régulière.

L'expression ci-dessous vérifie qu'il y a au moins un mot par ligne et qu'il y a au moins trois lignes mais pas plus de 10 lignes :

/(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+)*)){2,10}/is

Si vous voulez vérifier qu'il y a au moins 5 mots par ligne, vous devez changer le premier et le dernier caractère étoile (*) par {4,}

/(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+){4,})(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+){4,})){2,10}/is

Si voulez 1 ou plusieurs mots par ligne et de 1 à 5 lignes, vous pouvez changer les valeurs du quantificateur {0,4}.

/(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[</div>,.;:?!& \n\r]+(?: [<div class="simplebox">,.;:?!& \n\r]+)*)){0,4}/is

Limiter le nombre de mots

L'expression ci-dessous permet d'écrire au minimum 1 mot et au maximum 200 mots.

/^[-\w]+(?:\W+[-\w]+){0,199}\W*$/

Vous pouvez varier le minimum et le maximum selon vos besoins en changeant {0,199} ( voir ci-dessus le tableau Quantificateur)

Validation d'un mot

mot dans une liste

/^(arbre|feuille|fleur){1}$/

Le mot saisie doit correspondre exactement (minuscule) au mot dans la liste.

validation du mot dans une liste

/^(arbre|feuille|fleur){1}$/i

Ici, on ne tient pas compte des minuscules et des majuscules : Les mots suivants Arbre,arbre, ARBRE, ArBrE, etc. sont tous valides.

Pour tester vos expressions régulières vous pouvez utiliser ces testeurs d'expressions régulières: regex101 regex tester

To improve this wiki section, we kindly ask you to add your successfully tested regular expression(s) to provide a better understanding of this feature to the new LimeSurvey (potential) users.
  Attention : Please note that all the below examples are written on one line!



Important: Regular Expressions in conditions

Note that when using regular expressions in the condition editor, do NOT include the beginning and ending slash.


#Validation


Update (12/2018): Since these days domain names cannot only hold special characters like “ü” but also use more than 3 characters as domain name like .tech or .company, the below email regex only checks if “@” and “.” exists within the entered email address.

/^.+?@.+?\..+$/

If you want to validate one address per line, in a multiline long text field:

/^(((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*(\r\n)?\n?)+)*)$/

At this outdated regex the domain name is limited to 3 characters which doesn't cover all available domains:

/^(\w[-._+\w]*\w@\w[-._\w]*\w\.\w{2,3})$/

Codes postaux

Codes postaux australiens:

/^[0-9]{4}/

Codes postaux brésiliens

/^[0-9]{2}\.[0-9]{3}-[0-9]{3}$/

Codes postaux canadiens

/^[a-zA-Z]\d{1}[a-zA-Z](\-| |)\d{1}[a-zA-Z]\d{1}$/

Codes postaux américains

/^[0-9]{5}([- /]?[0-9]{4})?$/

For the postal code to start with zero, use:

/^[0-9]{5}(?:-[0-9]{4})?$/

Codes postaux britanniques

/^[A-Z][A-Z]?[0-9][A-Z0-9]? ?[0-9][ABDEFGHJLNPQRSTUWXYZ]{2}$/i

Notez que ceci n'est pas très exact et qu'une validation précise est beaucoup plus complexe. Par exemple, voir StackOverflow answer et Wikipedia pour plus informations.

Codes postaux français

/(^[0-8]\d\d{3}$)|(^9[0-5]\d{3}$)|(^97[1-6]\d{2}$)|(^98[46-8]\d{2}$)/

L'expression ci-dessus est très précise et permettra de vérifier l'existence ou non du département français (deux premiers chiffres), y compris les départements et territoires d'outre-mer (DOM-TOM).


Numéros de téléphone

US phone numbers

/^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$/

or

/^[\(\)\.\- ]{0,}[0-9]{3}[\(\)\.\- ]{0,}[0-9]{3}[\(\)\.\- ]{0,}[0-9]{4}[\(\)\.\- ]{0,}$/

This second option will match all phone Canadian and US phone numbers that include non-digit symbols including:

 . ( ) - (space)

This will allow you to match phone numbers which resemble below:

  • (555)555 5555
  • 555.555.5555
  • 555 555 5555
  • (555)-555-5555
  • 555-555-5555
  • 555555555

Australian phone numbers

The following patterns match all various Australian mobile and landline phone numbers including with "+61" country prefix:

  • (02) 9123 6535
  • 03 1234-5345
  • 0412 345 678
  • +61 2 3456 789

But not:

  • 234 3450 234
  • a234 534 3432
  • 134567
  • 123456789013

Brackets, white space and hypens are ignored.

The 'Very precise:' versions listed here match against the first four or five digits in a number to ensure that they are valid Australian numbers.

The 'Not very precise:' only match against the first and second digit so may allow invaid numbers.

All Australian phone numbers (mobile and landline - area code required)

Very precise:

/^\(?(?:\+?61|0)(?:(?:2\)?[ -]?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])|3\)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])|7\)?[ -]?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)|8\)?[ -]?(?:5[ -]?[1-4]|6[ -]?[0-8]|[7-9][ -]?[0-9]))(?:[ -]?[0-9]){6}|4\)?[ -]?(?:(?:[01][ -]?[0-9]|2[ -]?[0-57-9]|3[ -]?[1-9]|4[ -]?[7-9]|5[ -]?[018])[ -]?[0-9]|3[ -]?0[ -]?[0-5])(?:[ -]?[0-9]){5})$/

Not very precise:

/^(?:\+?61|0)[2-478](?:[ -]?[0-9]){8}$/

All Australian phone numbers (landlines only - area code required)

Very precise:

/^\(?(?:\+?61|0)(?:2\)?[ -]?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])|3\)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])|7\)?[ -]?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)|8\)?[ -]?(?:5[ -]?[1-4]|6[ -]?[0-8]|[7-9][ -]?[0-9]))(?:[ -]?[0-9]){6}$/

Not very precise:

/^(?:\+?61|\(?0)[2378]\)?(?:[ -]?[0-9]){8}$/

New South Wales landline phone numbers (area code optional)

Very precise:

/^(?:\(?(?:\+?61|0)2\)?[ -]?)?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])(?:[ -]?[0-9]){6}$/

Not very precise:

/^(?:\(?(?:\+?61|0)2\)?(?:[ -]?[0-9]){7}[0-9]$/

Victorian and Tasmanian landline phone numbers (area code optional)

Very precise:

/^(?:\(?(?:\+?61|0)3\)?[ -]?)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])(?:[ -]?[0-9]){6}$/

Not very precise:

/^(?:\(?(?:\+?61|0)3\)?(?:[ -]?[0-9]){7}[0-9]$/

Queensland landline phone numbers (area code optional)

Very precise:

/^(?:\(?(?:\+?61|0)7\)?[ -]?)?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)(?:[ -]?[0-9]){6}$/

Not very precise:

/^(?:\(?(?:\+?61|0)7\)?(?:[ -]?[0-9]){7}[0-9]$/

South Australia, Northern Territory, Western Australia landline phone numbers (area code optional)

Very precise:

/^(?:\(?(?:\+?61|0)8\)?[ -]?)?(?:5[1-4]|6[0-8]|[7-9][0-9])$/

Not very precise:

/^(?:\(?(?:\+?61|0)8\)?(?:[ -]?[0-9]){7}[0-9]$/

Australian mobile phone numbers only

Very precise:

/^(?:\+?61|0)4 ?(?:(?:[01] ?[0-9]|2 ?[0-57-9]|3 ?[1-9]|4 ?[7-9]|5 ?[018]) ?[0-9]|3 ?0 ?[0-5])(?: ?[0-9]){5}$/

Not very precise:

/^(?:\(?(?:\+?61|0)4\)?(?:[ -]?[0-9]){7}[0-9]$/

Belgian phone number

/^((\+|00)32\s?|0)(\d\s?\d{3}|\d{2}\s?\d{2})(\s?\d{2}){2}$/

Belgian mobile phone number

/^((\+|00)32\s?|0)4(60|[789]\d)(\s?\d{2}){3}$/

French phone number

/^((\+|00)33\s?|0)[1-59](\s?\d{2}){4}$/

French mobile phone number

/^((\+|00)33\s?|0)[67](\s?\d{2}){4}$/

Luxemburg phone number

/^((\+|00\s?)352)?(\s?\d{2}){3,4}$/

Luxemburg mobile phone number

/^((\+|00\s?)352)?\s?6[269]1(\s?\d{3}){2}$/

German marks (with optional plus or minus)

/^[1-6]{1}[\+|\-]?$/


Age validation

Example: Age 20-99

/([2-9][0-9])/

Example: Age 18-35

/(1[8-9]|2[0-9]|3[0-5])/

Example: Age 19-65

/^(1[8-9]|[2-5][0-9]|6[0-5])$/


Number validation

Numbers from 1 to 99999

/^([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9])$/
/^[1-9][0-9]{0,4}$/ does the same as above but should run a little faster

Numbers from 1 to 999, 1.000 to 999.999 to 999.999.999

/^[1-9][0-9]{0,2}(?:\.[0-9]{3}){0,2}$/

Accepts numbers from 1 to 999, 1.000 to 999.999 to 999.999.999 but rejects numbers like 999.1.1 , 94.22.22, 999.1.22, 999.11.1, 999.1.333

Number validation with optional decimal (for price)

Accepts numbers from 0 to 199, with 2 decimal optional:

/^([1][0-9][0-9]|[1-9][0-9]|[0-9])((\.)[0-9][0-9])?$/

Number validation with thousand separator

Space as separator, no minus

/^(?!0)\d{1,3}(\ \d{3})*$/

Dot as separator, minus allowed

/^-?(?!0)\d{1,3}(\.\d{3})*$/

It forces two decimal points and accepts numbers from 1.00 to 999,999,999.00 with an optional comma delimiting thousands/millions including all of the following: 1.00, 1,000.00, 12,345.67, 12345,02, 123,456,468.00, 1234566.00, 123456789.00 but not 1,23.00, 12,3.4 or 1234,43.04

/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/

Similar to the above: Forces two decimal points but accepts a "0" before decimal separator ",".

/[0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/

Same as above, but the two decimal points are optional:

/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}(?:\.[0-9]{2})?$/

Month (1-12)

If you want to ask for the month a person was born you can validate the input as follows:

/^[0]*[1-9]$|^[0]*1[0-2]$/

Minimum width (set to 3 in this example)

/^.{3,}$/


Currency

US currency (dollar sign and cents optional)

/^\$?\d+(\.(\d{2}))?$/

Check for comma usage:

/^\$?\d{1,3}(\d+(?!,))?(,\d{3})*(\.\d{2})?$/

Swiss price

A number with two decimal numbers after the decimal point of which the last one is either a 5 or a 0:

/^(\d+)(\.\d(05)?)?$/


Validate score

1-10

/^[1-9]{1}$|^10$/

1-100

/^[1-9]?[0-9]{1}$|^100$/


Text validation

The multiple short text question type doesn't support minimum or maximum answers at the moment. One way around this is to use a long free text question type with a regular expression.

The below expression tests for at least one word per line for at least 3 lines and no more than 10 lines:

/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)){2,10}/is

If you want, say five words per line, you could change the first and last star/asterisk to {4,}:

/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+){4,})(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+){4,})){2,10}/is

If you wanted one or more words per line (between line 1 and line 5), you can change the content located within the last curly braces to 0,4 (note you use 0 because you're already matching the first line).

/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)){0,4}/is

Word count

The following restricts the number of words allowed to a minimum of 1 and a maximum of 200:
/^[-\w]+(?:\W+[-\w]+){0,199}\W*$/
To increase the minimum change the zero part of {0,199}.

To increase or decrease the maximum change the "199" part of {0,199}.

Time validation

There are a number of ways to write time formats. Some of the possible options are 12 hour or 24 hour, with seconds or without. Although it is an option to use the date question type (it can also capture time) you can use the short free text question type with one of the below validation regular expressions.

The following three validation strings test for 24 hour time (in order of appearances) without seconds, with optional seconds lastly with seconds required:

/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/
/^(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?$/
/^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/

The following three match 12 hour time, as above with seconds, optional seconds and with seconds required:

/^(?">00:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9] (?:pm|PM))$/
/^(?:00:[0-5][0-9](?::[0-5][0-9])? (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9](?::[0-5][0-9])? (?:[ap]m|[AP]M)|12:[0-5][0-9](?::[0-5][0-9])? (?:pm|PM))$/
/^(?:00:[0-5][0-9]:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9]:[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9]:[0-5][0-9] (?:pm|PM))$/

The following three match either 12 or 24 hour time as above with seconds, optional seconds and with seconds required:

/^(?:(?:00:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9] (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9])$/
/^(?:(?:00:[0-5][0-9](?[0-5][0-9])? (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9](?[0-5][0-9])? (?:[ap]m|[AP]M)|12:[0-5][0-9](?[0-5][0-9])? (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9](?[0-5][0-9])?)$/
/^(?:(?:00:[0-5][0-9]:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9]:[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9]:[0-5][0-9] (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])$/

US states

To validate for one state use the following (example is Texas):

  • TX uppercase only:
    /^(TX)$/
    
  • tx lowercase only:
    /^(tx)$/
    
  • TX upper or lowercase:
    /^([T|t][X|x])$/
    


Profanity Filter

To filter profanity words from an answer:

/^(?i)((?!\bENTERPROFANITYHERE\b).)*$(?-i)/

Replace "ENTERPROFANITYHERE" with your bad word.

The \b will allow passing of words such as "assassination" and "hello" if you enter "ass" or "hell" as your profanity word. This also works if you are trying to omit other words, names etc. from answers.


Helpful links

In the beginning of this wiki section, we recommend you to use https://regex101.com/ to test/create regular expressions. You can also use https://www.regextester.com/ to create expressions in case you are unhappy about the first option. You can use https://extendsclass.com/regex-tester.html to visualize regular expressions.