[0001]
[0002]
[0003]
[0004]
[0005]
[0006]
[0007]
[0008]
[0009]
[0010]
[0011]
[0012]
[0013]
[0014]
[0015]
[0016]
[0017]
[0018]
[0019]
[0020]
[0021]
[0022]
[0023]
[0024]
[0025]
[0026]
[0027]
[0028]
[0029]
[0030]
[0031]
[0032]
[0033]
[0034]
[0035]
[0036]
[0037]
[0038]
[0039]
[0040]
[0041]
[0042]
[0043]
[0044]
[0045]
[0046]
[0047]
[0048]
[0049]
[0050]
[0051]
[0052]
[0053]
[0054]
[0055]
[0056]
[0057]
[0058]
[0059]
[0060]
[0061]
[0062]
[0063]
[0064]
[0065]
[0066]
[0067]
[0068]
[0069]
[0070]
[0071]
[0072]
[0073]
[0074]
[0075]
[0076]
[0077]
[0078]
[0079]
[0080]
[0081]
[0082]
[0083]
[0084]
[0085]
[0086]
[0087]
[0088]
[0089]
[0090]
[0091]
[0092]
[0093]
[0094]
[0095]
[0096]
[0097]
[0098]
[0099]
[0100]
[0101]
[0102]
[0103]
[0104]
[0105]
[0106]
[0107]
[0108]
[0109]
[0110]
[0111]
[0112]
[0113]
[0114]
[0115]
[0116]
[0117]
[0118]
[0119]
[0120]
[0121]
[0122]
[0123]
[0124]
[0125]
[0126]
[0127]
[0128]
[0129]
[0130]
[0131]
[0132]
[0133]
[0134]
[0135]
[0136]
[0137]
[0138]
[0139]
[0140]
[0141]
[0142]
[0143]
[0144]
[0145]
[0146]
[0147]
[0148]
[0149]
[0150]
[0151]
[0152]
[0153]
[0154]
[0155]
[0156]
[0157]
[0158]
[0159]
[0160]
[0161]
[0162]
[0163]
[0164]
[0165]
[0166]
[0167]
[0168]
[0169]
[0170]
[0171]
[0172]
[0173]
[0174]
[0175]
[0176]
[0177]
[0178]
[0179]
[0180]
[0181]
[0182]
[0183]
[0184]
[0185]
[0186]
[0187]
[0188]
[0189]
[0190]
[0191]
[0192]
[0193]
[0194]
[0195]
[0196]
[0197]
[0198]
[0199]
[0200]
[0201]
[0202]
[0203]
[0204]
[0205]
[0206]
[0207]
[0208]
[0209]
[0210]
[0211]
[0212]
[0213]
[0214]
[0215]
[0216]
[0217]
[0218]
[0219]
[0220]
[0221]
[0222]
[0223]
[0224]
[0225]
[0226]
[0227]
[0228]
[0229]
[0230]
[0231]
[0232]
[0233]
[0234]
[0235]
[0236]
[0237]
[0238]
[0239]
[0240]
[0241]
[0242]
[0243]
[0244]
[0245]
[0246]
[0247]
[0248]
[0249]
[0250]
[0251]
[0252]
[0253]
[0254]
[0255]
[0256]
[0257]
[0258]
[0259]
[0260]
[0261]
[0262]
[0263]
[0264]
[0265]
[0266]
[0267]
[0268]
[0269]
[0270]
[0271]
[0272]
[0273]
[0274]
[0275]
[0276]
[0277]
[0278]
[0279]
[0280]
[0281]
[0282]
[0283]
[0284]
[0285]
[0286]
[0287]
[0288]
[0289]
[0290]
[0291]
[0292]
[0293]
[0294]
[0295]
[0296]
[0297]
[0298]
[0299]
[0300]
[0301]
[0302]
[0303]
[0304]
[0305]
[0306]
[0307]
[0308]
[0309]
[0310]
[0311]
[0312]
[0313]
[0314]
[0315]
[0316]
[0317]
[0318]
[0319]
[0320]
[0321]
[0322]
[0323]
[0324]
[0325]
[0326]
[0327]
[0328]
[0329]
[0330]
[0331]
[0332]
[0333]
[0334]
[0335]
[0336]
[0337]
[0338]
[0339]
[0340]
[0341]
[0342]
[0343]
[0344]
[0345]
[0346]
[0347]
[0348]
[0349]
[0350]
[0351]
[0352]
[0353]
[0354]
[0355]
[0356]
[0357]
[0358]
[0359]
[0360]
[0361]
[0362]
[0363]
[0364]
[0365]
[0366]
[0367]
[0368]
[0369]
[0370]
[0371]
[0372]
[0373]
[0374]
[0375]
[0376]
[0377]
[0378]
[0379]
[0380]
[0381]
[0382]
[0383]
[0384]
[0385]
[0386]
[0387]
[0388]
[0389]
[0390]
[0391]
[0392]
[0393]
[0394]
[0395]
[0396]
[0397]
[0398]
[0399]
[0400]
[0401]
[0402]
[0403]
[0404]
[0405]
[0406]
[0407]
[0408]
[0409]
[0410]
[0411]
[0412]
[0413]
[0414]
[0415]
[0416]
[0417]
[0418]
[0419]
[0420]
[0421]
[0422]
[0423]
[0424]
[0425]
[0426]
[0427]
[0428]
[0429]
[0430]
[0431]
[0432]
[0433]
[0434]
[0435]
[0436]
[0437]
[0438]
[0439]
[0440]
[0441]
[0442]
[0443]
[0444]
[0445]
[0446]
[0447]
[0448]
[0449]
[0450]
[0451]
[0452]
[0453]
[0454]
[0455]
[0456]
[0457]
[0458]
[0459]
[0460]
[0461]
[0462]
[0463]
[0464]
[0465]
[0466]
[0467]
[0468]
[0469]
[0470]
[0471]
[0472]
[0473]
[0474]
[0475]
[0476]
[0477]
[0478]
[0479]
[0480]
[0481]
[0482]
[0483]
[0484]
[0485]
[0486]
[0487]
[0488]
[0489]
[0490]
[0491]
[0492]
[0493]
[0494]
[0495]
[0496]
[0497]
[0498]
[0499]
[0500]
[0501]
[0502]
[0503]
[0504]
[0505]
[0506]
[0507]
[0508]
[0509]
[0510]
[0511]
[0512]
[0513]
[0514]
[0515]
[0516]
[0517]
[0518]
[0519]
[0520]
[0521]
[0522]
[0523]
[0524]
[0525]
[0526]
[0527]
[0528]
[0529]
[0530]
[0531]
[0532]
[0533]
[0534]
[0535]
[0536]
[0537]
[0538]
[0539]
[0540]
[0541]
[0542]
[0543]
[0544]
[0545]
[0546]
[0547]
[0548]
[0549]
[0550]
[0551]
[0552]
[0553]
[0554]
[0555]
[0556]
[0557]
[0558]
[0559]
[0560]
[0561]
[0562]
[0563]
[0564]
[0565]
[0566]
[0567]
[0568]
[0569]
[0570]
[0571]
[0572]
[0573]
[0574]
[0575]
[0576]
[0577]
[0578]
[0579]
[0580]
[0581]
[0582]
[0583]
[0584]
[0585]
[0586]
[0587]
[0588]
[0589]
[0590]
[0591]
[0592]
[0593]
[0594]
[0595]
[0596]
[0597]
[0598]
[0599]
[0600]
[0601]
[0602]
[0603]
[0604]
[0605]
[0606]
[0607]
[0608]
[0609]
[0610]
[0611]
[0612]
[0613]
[0614]
[0615]
[0616]
[0617]
[0618]
[0619]
[0620]
[0621]
[0622]
[0623]
[0624]
[0625]
[0626]
[0627]
[0628]
[0629]
[0630]
[0631]
[0632]
[0633]
[0634]
[0635]
[0636]
[0637]
[0638]
[0639]
[0640]
[0641]
<!DOCTYPE html>
<!-- WASDOC AXP-2.0.0 (CGILIB AXP-1.9.9) -->
<!-- wasDOC Copyright (C) 2019,2020 Mark G.Daniel - Apache-2.0 licenced -->
<!--  3-NOV-2021 02:50 -->
<noscript>NOTE: SOME FUNCTIONALITY EMPLOYS JAVASCRIPT</noscript>
<div id="erreport1" style="display:none;"></div>
<script>
function errorReport(string) {
   for (var cnt = 1; cnt <= 2; cnt++) {
      var err = document.getElementById('erreport'+cnt);
      err.style.display = 'block';
      err.innerHTML += string;
   }
}
</script>
<style type="text/css">
html { font-family: arial, verdana, sans-serif; font-size:12pt; margin:1em; }
h1 { font-size:124%; font-style:bold;
     margin-top:1em; margin-bottom:0.5em; }
h2 { font-size:120%; font-style:bold;
     margin-top:1.1em; margin-bottom:0.4em; }
h3 { font-size:116%; font-style:bold;
     margin-top:1.0em; margin-bottom:0.3em; }
h4 { font-size:112%; font-style:bold;
     margin-top:1.1em; margin-bottom:0.3em; }
h5 { font-size:112%; font-style:bold; 
     margin-top:1.1em; margin-bottom:0.3em; }
h6 { font-size:112%; font-style:bold; padding:0; margin:0; }

h1 .text { text-decoration:underline; }
h1 .numb { padding-right:0.8em; }
h1 .numb:empty { display:none; padding-right:0; }
h2 .numb { padding-right:0.8em; }
h2 .numb:empty { display:none; padding-right:0; }
h3 .numb { padding-right:0.8em; }
h3 .numb:empty { display:none; padding-right:0; }
h4 .numb { padding-right:0.8em; }
h4 .numb:empty { display:none; padding-right:0; }
h5 .numb { display:none; padding-right:0; }
h6 .numb { display:none; padding-right:0; }

kbd { font-family:monospace; }

noscript { font-size:1.2em; }

p { line-height:1.1em; margin-top:1em; margin-bottom:1em; }

.chunk { font-size:130%; text-decoration:underline; }
.head {}
.high {}
.bold { font-weight:bold; }
.center { text-align:center; }
.italic { font-style:italic; }
.left { text-align:left; }
.nowrap { white-space:nowrap; }
.prewrap { white-space:pre; }
.right { text-align:right; }
.strike { text-decoration:line-through; }
.under { text-decoration:underline; }

.backlight { background-color:#f2f2f2; }
.display0 { display:none; }

img { max-width:100%; }
.imglink { }

.link { }
.blank { }

.list { margin-bottom:1em; }
.list li { margin-top:0.5em; }
.list0 li { margin-top:0; }
.item {}

.tabl { border-collapse:collapse; text-align:left; margin:0.4em 2em 0.5em 2em; }
.tabu { border-collapse:collapse; text-align:right; margin:0.4em 2em 0.5em 2em; }

.tabr { vertical-align:top; }
.tabh { padding:0.2em 0 0 2em; margin:0; }
.tabd { padding:0.1em 0 0 2em; margin:0; }
.tabh:first-of-type, td:first-of-type { padding-left:0; }

.tabu .tabh,
.tabu .tabd { border:1px solid gray; padding:0.2em 0.3em 0.2em 0.3em; }
.tab0 { border:none; visibility:hidden; max-width:1em; 
        white-space:nowrap; overflow:hidden; }

.tabauto { margin-left:auto; margin-right:auto; }

.tabr:empty { height:0.2em; }
.tabu .tabh:empty, .tabu .tabd:empty { border:none; visibility:hidden; }

.error { font-size:110%; color:black; background-color:yellow;
         font-family:sans-serif; font-weight:bold; font-style:normal;
         width:95%; border:solid 1px gray; padding:0.5em 1em 0.5em 1em; }
.error::before { content:'\026a0\00a0'; }
.image { }
.page { width:98%; border:1px dashed gray; margin:1.5em 0 1.8em 0; }
.epage { width:98%; border:1px dashed black; margin:1.5em 0 1.8em 0; }
.monosp { font-family:monospace; }
.ppage { display:none; }
.simple { list-style-type:none; }
.valtop { vertical-align:top; }
.valmid { vertical-align:middle; }
.valbot { vertical-align:bottom; }

.code { border-style:solid; border-width:0 0 0 1px; padding-left:1em;
        font-family:monospace; white-space:pre; }
.block { }
.blockof { margin:0.4em 2em 0.5em 2em; }
.example { border-style:dashed; border-width:0 0 0 1px; padding-left:1em;
           margin-top:0.5em; margin-bottom:0.5em; white-space:pre; }
.indent { margin-left:2em; margin-right:2em; }
.noindent { margin-left:0; margin-right:0; }
.inblock { display:inline-block; }
.mono { white-space:pre; font-family:monospace; }
.note { margin:0.4em 2em 0.5em 2em; page-break-inside:avoid; }
.note h5 { margin-top:0 }
.note_hr { width:80%; border:1px solid gray; }
.prop { padding-left:1em; margin-top:0.5em; margin-bottom:0.5em; }
.quote { border-style:dashed; border-width:0 0 0 1px; padding-left:1em;
         margin-top:0.5em; margin-bottom:0.5em; }
.this { display:none; }

a:link,a:visited { color:black; text-decoration:none; }
a:hover,a:active { text-decoration:underline; }
a:focus { outline:0; } 

:target:before { content:''; display:block; height:0.1em; margin:-0.1em; }
a.link:link, a.link:visited,a.link:active 
{ color:midnightBlue; text-decoration:underline; text-decoration-style:solid; }

.TOC1cols1 { width:80%; max-width:80%; }
.TOC1cols2 { column-count:2; width:80%; max-width:80%; }
.TOC1cols3 { column-count:3; max-width:90%; max-width:90%; }
.TOC1cols4 { column-count:4; max-width:100%; max-width:100%; }
.TOC1table { margin-left:2em; white-space:nowrap; break-inside:auto; }
.TOC1table tr { vertical-align:top; text-align:left; break-inside:avoid; break-after:auto; }
.TOC1table td+td { padding:0 0 0 0.5em; }
.TOC1table .numb { width:3em; max-width:3em; }
.TOC1table .sepr { width:5em; max-width:6em; overflow:hidden; }
.TOC1table .majr { font-weight:bold; }
.TOC1table .text { white-space:normal; }

/* These are due to Firefox (at least <= 76) recalcitrant multi-column handling.
   Web search "Split table into css columns, issue in Firefox" (stackoverflow).
   "Good grief, Charlie Brown!" */
 
.TOC1cols2 table,
.TOC1cols2 tbody,
.TOC1cols2 tr,
.TOC1cols3 table,
.TOC1cols3 tbody,
.TOC1cols3 tr,
.TOC1cols4 table,
.TOC1cols4 tbody,
.TOC1cols4 tr { display:block; padding:0; }

.TOC2cols1 { width:60%; max-width:60%; }
.TOC2cols2 { column-count:2; width:70%; max-width:70%; }
.TOC2cols3 { column-count:3; width:80%; max-width:80%; }
.TOC2cols4 { column-count:4; width:90%; max-width:90%; }
.TOC2table { margin-left:2em; white-space:nowrap; break-inside:auto; }
.TOC2table tr { vertical-align:top; text-align:left; break-inside:avoid; break-after:auto; }
.TOC2table .numb { font-weight:bold; padding-right:0.5em; }
.TOC2table .text { width:100%; white-space:normal; }

/* see "recalcitrant" above */
.TOC2cols2 table,
.TOC2cols2 tbody,
.TOC2cols2 tr,
.TOC2cols3 table,
.TOC2cols3 tbody,
.TOC2cols3 tr,
.TOC2cols4 table,
.TOC2cols4 tbody,
.TOC2cols4 tr { display:block; padding:0; }

.NAVtable { margin:0.1em 0 0 2em; }
.NAVtable td { font-size:110%; font-weight:bold; padding:0; margin:0; }
.NAVtable a { padding:0 0.5em 0 0.5em; text-decoration:none; }

.IDXcols1 { width:80%; max-width:80%; }
.IDXcols2 { column-count:2; width:90%; max-width:90%; }
.IDXcols3 { column-count:3; width:95%; max-width:95%;  }
.IDXcols4 { column-count:4; width:100%; max-width:100%;  }
.IDXtable { margin:1em 0 1em 2em; white-space:nowrap; break-inside:auto; }
.IDXtable tr { vertical-align:top; text-align:left; break-inside:avoid; break-after:auto; }
.IDXtable .alpha { font-weight:bold; min-width:2em; }
.IDXtable .text  { width:100%; white-space:normal; }
.IDXtable .para:before { content:'\00b6\00a0'; }

/* see "recalcitrant" above */
.IDXcols2 table,
.IDXcols2 tbody,
.IDXcols2 tr,
.IDXcols3 table,
.IDXcols3 tbody,
.IDXcols3 tr,
.IDXcols4 table,
.IDXcols4 tbody,
.IDXcols4 tr { display:block; padding:0; }

.insight { background-color:cyan; font-family:monospace;
           padding:0 0.2em 0 0.2em; margin:0 0.2em 0 0.2em;
           font-size:100%; font-style:normal; font-weight:normal;
           text-decoration:none; }

.wasdoc { font-family: "Lucida Console", Monaco, monospace; 
          letter-spacing:-0.07em; }

@media screen { .blank::after { content:"\2924"; } 
                .print { display:none; }
}

@media print {
   table { page-break-inside:avoid; }
   .noprint { display:none; }
   .page { border:none; page-break-after: always; }
   .epage { display:none; }
   .ppage { page-break-after:always; }
   .NAVtable { display:none; }
   .NAVprint { display:block!important; }
}

@page { margin:2cm 1cm 2cm 1cm;  }
</style>
<!-- source:0000_config.wasdoc -->

<style type="text/css">._smiley::after { font-size:150%; vertical-align:middle; content:'\263a' }</style>
<style type="text/css">._frowny::after { font-size:150%; vertical-align:middle; content:'\2639' }</style>

<a id="0." href="#"></a>
<title>WASD Configuration &ndash; String Matching</title>
<a id="4." href="#"></a>
<a id="4.stringmatching" href="#"></a>
<a id="stringmatching" href="#"></a>
<h1 class="head chunk">WASD Configuration</h1>
<h1 class="head"><span class="numb">4.</span><span class="text">String Matching</span></h1>

<table class="TOC2table">
<tr><td><a href="config004.html#4.1.wildcardpatterns"><span class="numb">4.1</span><span class="text">Wildcard Patterns</span></a>
<tr><td><a href="config004.html#4.2.regularexpressions"><span class="numb">4.2</span><span class="text">Regular Expressions</span></a>
<tr><td><a href="config004.html#4.3.examples"><span class="numb">4.3</span><span class="text">Examples</span></a>
<tr><td><a href="config004.html#4.4.expressionsubstitution"><span class="numb">4.4</span><span class="text">Expression Substitution</span></a>
</table>
</div>

<table class="NAVtable NAVprint"><tr>
<td><a href="javascript:window.history.back();">&#8617;&#xFE0E;</a>
<td><a href="config003.html#3.">&#8598;&#xFE0E;</a>
<td><a href="config000.html#0.">&#8593;&#xFE0E;</a>
<td><a href="config005.html#5.">&#8600;&#xFE0E;</a>
<td><a href="javascript:window.history.forward();">&#8618;&#xFE0E;</a>
</table>

<p> Matching of strings is a pervasive and important function within the server. 
Two types are supported; wildcard and regular expression.  Wildcard matching is
generally much less expensive (in CPU cycles and time) than regular expression
matching and so should always be used unless the match explicitly requires
otherwise. WASD attempts to improve the efficiency of both by performing a
preliminary pass to make simple matches and eliminate obvious mismatches using
a very low-cost comparison.   This either matches or doesn't, or encounters a
pattern matching meta-character which causes it to undertake full pattern
matching.

<p> To assist with the refinement of string matching patterns the Server
Administration facility has a report item named &quot;Match&quot;.  This report allows
the input of target and match strings and allows direct access to the server's
wildcard and regular expression matching routines.  Successful matches show the
matching elements and a substitution field (<a class="link" href="config004.html#4.4.expressionsubstitution">4.4 Expression Substitution</a>)
allows resultant strings to be assessed.

<p> To determine what string match processing is occuring during request
processing in the running server use the <span class="high italic">match</span> item available from the
Server Administration WATCH Report.

<a id="4.1" href="#"></a>
<a id="4.1.wildcardpatterns" href="#"></a>
<a id="wildcardpatterns" href="#"></a>
<h2 class="head"><span class="numb">4.1</span><span class="text">Wildcard Patterns</span></h2>

<p> Wildcard patterns are simple, low-cost mechanisms for matching a string to a
template.  They are designed to be used in path and authorization mapping to
compare a request path to the root (left-hand side) or a template expression.

<a id="4.1.0.0.1" href="#"></a>
<a id="4.1.wildcardoperators" href="#"></a>
<a id="wildcardoperators" href="#"></a>
<h5 class="head"><span class="text">Wildcard Operators</span></h5>

<table class="tabl">
<tr class="tabr under">
<th class="tabh">Expression
<th class="tabh">Purpose
<tr class="tabr">
<tr class="tabr">
<td class="tabd">*
<td class="tabd">Match zero or more characters (non-greedy)
<tr class="tabr">
<td class="tabd">**
<td class="tabd">Match zero or more characters (greedy)
<tr class="tabr">
<td class="tabd">%
<td class="tabd">Match any one character
</table>

<p> Wildcard matching uses the '*' and '%' symbols to match any zero or more,
or any one character respectively.  The '*' wildcard can either be greedy or
non-greedy depending on the context (and for historical reasons).  It can also
be forced to be greedy by using two consecutive ('**').  By default it is not
greedy when matching request paths for mapping or authentication, and is greedy
at other times (matching strings within conditional testing, etc.)

<a id="4.1.0.0.2" href="#"></a>
<a id="4.1.greedyandnongreedy" href="#"></a>
<a id="greedyandnongreedy" href="#"></a>
<h5 class="head"><span class="text">Greedy and Non-Greedy</span></h5>

<p> Non-greedy matching attempts to match an asterisk wildcard up until the
first character that is not the same as the character immediately following the
wildcard.  It matches a minimum number of characters before failing.
Greedy matching attempts to match all characters up until the first string
that does not match what follows the asterisk.

<p> To illustrate; using the following string
<div class="blockof code">non-greedy character matching compared to greedy character matching
</div>

the following non-greedy pattern

<div class="blockof code">*non-greedy character*matching
</div>

does not match but the following greedy pattern

<div class="blockof code">*non-greedy character**matching
</div>

does match.  The non-greedy one failed as soon as it encountered the space
following the first &quot;matching&quot; string, while the greedy pattern continued to
match eventually encountering a string matching the string following the greedy
wildcard.

<a id="4.2" href="#"></a>
<a id="4.2.regularexpressions" href="#"></a>
<a id="regularexpressions" href="#"></a>
<h2 class="head"><span class="numb">4.2</span><span class="text">Regular Expressions</span></h2>

<p> Regular expression matching is case insensitive (in line with other WASD
behaviour) and uses the POSIX EGREP pattern syntax and capabilities.  Regular
expression matching offers significant but relatively expensive functionality. 
One of those expenses is expression compilation.  WASD attempts to eliminate
this by pre-compiling expressions during server startup whenever feasable. 
Regular expression matching must be enabled using the [RegEx]
WASD_CONFIG_GLOBAL directive and are then differentiated from wildcard patterns
by using a leading &quot;^&quot; character.

<p> A detailed tutorial on regular expression capabilities and usage is well
beyond the scope of this document.  Many such hard-copy and on-line documents
are available.

<p class="indent"> <a class="link blank" target="_blank" href="http://en.wikipedia.org/wiki/Regular_expression">http://en.wikipedia.org/wiki/Regular_expression</a>

<p> This summary is only to serve as a quick mnemonic.  WASD regular
expressions support the following set of operators.

<a id="4.2.0.0.1" href="#"></a>
<a id="4.2.operatoroverview" href="#"></a>
<a id="operatoroverview" href="#"></a>
<h5 class="head"><span class="text">Operator Overview</span></h5>

<table class="tabl nowrap">
<tr class="tabr under">
<th class="tabh">Description
<th class="tabh">Usage
<tr class="tabr">
<tr class="tabr">
<td class="tabd">Match-self Operator
<td class="tabd">Ordinary characters.
<tr class="tabr">
<td class="tabd">Match-any-character Operator
<td class="tabd">.
<tr class="tabr">
<td class="tabd">Concatenation Operator
<td class="tabd">Juxtaposition.
<tr class="tabr">
<td class="tabd">Repetition Operators
<td class="tabd">*  +  ? {}
<tr class="tabr">
<td class="tabd">Alternation Operator
<td class="tabd">&verbar;
<tr class="tabr">
<td class="tabd">List Operators
<td class="tabd">[...]  [^...]
<tr class="tabr">
<td class="tabd">Grouping Operators
<td class="tabd">(...)
<tr class="tabr">
<td class="tabd">Back-reference Operator
<td class="tabd">&#94;digit
<tr class="tabr">
<td class="tabd">Anchoring Operators
<td class="tabd">^  &dollar;
<tr class="tabr">
<td class="tabd">Backslash Operator
<td class="tabd">Escape meta-character; i.e.
&#94; ^ . &dollar; &verbar; [ (
</table>

<p> The following operators are used to match one, or in conjunction with the
repetition operators more, characters of the target string.  These single and
leading characters are reserved meta-characters and must be escaped using a
leading backslash (&quot;&#94;&quot;) if required as a literal character in
the matching pattern. <span class="high bold">Note</span> that this does not apply to the
<span class="high italic">range</span> hyphen; to include a hyphen in a range ensure the character
is the first or last in the range.

<a id="4.2.0.0.2" href="#"></a>
<a id="4.2.matchingoperators" href="#"></a>
<a id="matchingoperators" href="#"></a>
<h5 class="head"><span class="text">Matching Operators</span></h5>

<table class="tabl nowrap">
<tr class="tabr under">
<th class="tabh">Expression
<th class="tabh">Purpose
<tr class="tabr">
<tr class="tabr">
<td class="tabd">^
<td class="tabd">Match the beginning of the line
<tr class="tabr">
<td class="tabd">.
<td class="tabd">Match any character
<tr class="tabr">
<td class="tabd">&dollar;
<td class="tabd">Match the end of the line
<tr class="tabr">
<td class="tabd">&verbar;
<td class="tabd">Alternation (or)
<tr class="tabr">
<td class="tabd">[abc]
<td class="tabd">Match only a, b or c
<tr class="tabr">
<td class="tabd">[^abc]
<td class="tabd">Match anything except a, b and c
<tr class="tabr">
<td class="tabd">[a-z0-9]
<td class="tabd">Match any character in the range a to z or 0 to 9
</table>

<p> Repetition operators control the extent, or number, of whatever the
matching operators match. These are also reserved meta-characters and must be
escaped using a leading backslash if required as a literal character.

<a id="4.2.0.0.3" href="#"></a>
<a id="4.2.repetitionoperators" href="#"></a>
<a id="repetitionoperators" href="#"></a>
<h5 class="head"><span class="text">Repetition Operators</span></h5>

<table class="tabl nowrap">
<tr class="tabr under">
<th class="tabh">Expression
<th class="tabh">Function
<tr class="tabr">
<tr class="tabr">
<td class="tabd">*
<td class="tabd">Match 0 or more times
<tr class="tabr">
<td class="tabd">+
<td class="tabd">Match 1 or more times
<tr class="tabr">
<td class="tabd">?
<td class="tabd">Match 1 or zero times
<tr class="tabr">
<td class="tabd">{n}
<td class="tabd">Match exactly n times
<tr class="tabr">
<td class="tabd">{n,}
<td class="tabd">Match at least n times
<tr class="tabr">
<td class="tabd">{n,m}
<td class="tabd">Match at least n but not more than m times
</table>

<a id="4.3" href="#"></a>
<a id="4.3.examples" href="#"></a>
<a id="examples" href="#"></a>
<h2 class="head"><span class="numb">4.3</span><span class="text">Examples</span></h2>

<p> The following provides a series of examples as they might occur in use
for server configuration.

<ol class="list">

<li class="item"> Equivalent functionality using wildcard and regular expression patterns. 
Note that &quot;Mozilla&quot; must be at the start of the string, with the
regular expression using the start-of-string anchor resulting in two
consecutive &quot;^&quot;s, one indicating to WASD a regular expression, the other
being part of the expression itself.

<div class="blockof code">if (user-agent:Mozilla*Gecko*)
if (user-agent:^^Mozilla.*Gecko)
</div>

<li class="item"> This shows path matching using equivalent wildcard and regular expression
matching.  Note the requirement to use the regular expression
<span class="high italic">grouping</span> parentheses to provide the substitution elements,
something provided implicitly with wildcard matching.

<div class="blockof code">map /*/-/* /wasd_root/runtime/*/*
map ^/(.+)/-/(.+) /wasd_root/runtime/*/*
</div>

<li class="item"> This rather contrived regular expression example has no equivalent
capability available with wildcard matching.  It forbids the use of any path
that contains any character other than alpha-numerics, the hyphen, underscore,
period and forward-slash.

<div class="blockof code">pass ^[^-_./a-z0-9]+ &quot;403 Forbidden character in path!&quot;
</div>

</ol>

<a id="4.4" href="#"></a>
<a id="4.4.expressionsubstitution" href="#"></a>
<a id="expressionsubstitution" href="#"></a>
<h2 class="head"><span class="numb">4.4</span><span class="text">Expression Substitution</span></h2>

<p> Expression substitution is available during path mapping (<a class="link" href="config010.html#10.requestprocessingconfiguration">10. Request Processing Configuration</a>).  Both wildcard (implicitly) and regular
expressions (using <span class="high italic">grouping</span> operators) note the offsets of matched portions
of the strings.  These  are then used for wildcard and <span class="high italic">specified</span> wildcard
substitution where result strings provide for this (e.g. mapping 'pass' and
'redirect' rules).  A maximum of nine such wildcard substitutions are supported
(one other, the zeroeth, is the full match).

<a id="4.4.0.0.1" href="#"></a>
<a id="4.4.wildcardsubstitution" href="#"></a>
<a id="wildcardsubstitution" href="#"></a>
<h5 class="head"><span class="text">Wildcard Substitution</span></h5>

<p> With wildcard matching each asterisk wildcard contained in the pattern
(<span class="high italic">template</span> string) has matching characters in the <span class="high italic">target</span> string noted and
stored.  Note that for the percentage (single character) wildcard no such
storage is provided.  These characters are available for substitution using
corresponding wildcards present in the <span class="high italic">result</span> string.  For instance, the
target string

<div class="blockof code">this is an example target string
</div>

would be matched by the pattern string

<div class="blockof code">* is an example target *
</div>

as containing two matching wildcard strings

<div class="blockof code">this
string
</div>

which could be substituted using the result string

<div class="blockof code">* is an example result * 
</div>

producing the resultant string

<div class="blockof code">this is an example result string
</div>

<a id="4.4.0.0.2" href="#"></a>
<a id="4.4.regularexpressionsubstitution" href="#"></a>
<a id="regularexpressionsubstitution" href="#"></a>
<h5 class="head"><span class="text">Regular Expression Substitution</span></h5>

<p> With regular expression matching the groups of matching characters must be
explicitly specified using the <span class="high italic">grouping</span> parenthesis operator.  Hence with
regular expression matching it is possible to match many characters from the
target string without retaining them for later substitution.  Only if that
match is designated as a subsitution source do the matching characters become
available for substituion via any result string.  Using two possible target
strings as an example
<div class="blockof code">this is an example target string
this is a contrived target string
</div>
would both be matched by the regular expression
<div class="blockof code">^^([a-z]*) is [a-z ]* target ([a-z]*)&dollar;
</div>
which though it contains three regular expressions in the pattern, only
two have the grouping parentheses, and so make their matching string available
for substitution
<div class="blockof code">this
string
</div>
which could be substituted using the result string
<div class="blockof code">* is the final result * 
</div>
producing the resultant string
<div class="blockof code">this is the final result string
</div>

<a id="4.4.0.0.3" href="#"></a>
<a id="4.4.specifiedsubstitution" href="#"></a>
<a id="specifiedsubstitution" href="#"></a>
<h5 class="head"><span class="text">Specified Substitution</span></h5>

<p> By default the strings matched by wildcard or grouping operators are
substituted in the same order in which they are matched.  This order may be
changed by specifying which wildcard string should be substituted where.  Not
all matched (and stored) strings need to be substituted.  Some may be omitted
and the contents effectively ignored.

<p> The specified substitution syntax is a result wildcard followed by a
single-apostrophe (') and a single digit from zero to nine (0&hellip;9).  The
zeroeth element is the full matching string.  Element one is the first matching
part of the expression, on through to the last.  Specifying an element that had
no matching string substitutes an empty string (i.e. nothing is added).  Using
the same target string as in the previous previous example
<div class="blockof code">this is an example target string
</div>
and matched by the wildcard pattern string
<div class="blockof code">* is an example target *
</div>
when substituted by the result string
<div class="blockof code">*'2 is an example result
</div>
would produce the resultant string
<div class="blockof code">string is an example result
</div>
with the string represented by the first wildcard effectively being discarded.
<!-- source:0700_CONDITIONAL.WASDOC -->

<table class="NAVtable NAVprint"><tr>
<td><a href="javascript:window.history.back();">&#8617;&#xFE0E;</a>
<td><a href="config003.html#3.">&#8598;&#xFE0E;</a>
<td><a href="config000.html#0.">&#8593;&#xFE0E;</a>
<td><a href="config005.html#5.">&#8600;&#xFE0E;</a>
<td><a href="javascript:window.history.forward();">&#8618;&#xFE0E;</a>
</table>