Search Pattern Cookbook  
The Search function is very powerful. Searches using a 
RegularExpression  play an important part of tapping Foswiki's full potential. Unfortunately 
RegularExpressions  can be incredibly obscure to the uninitiated. 
Most people not familiar (enough) with Regular Expressions mostly cut and paste (and maybe tweak) from existing examples. This page intends to collect lots of examples together.
  Problem definition  
Suppose there is a topic with a table defining entries in a 
data form . I.e. they define select menu items in a form definition. They are then formatted like:
| *Name*  | *Type* | *Tooltip message* |
| option1 | option |                   |
| option2 | option |                   |
| option3 | option |                   |
 
How to extract the 'name' values, i.e. 'option1', 'option2' and 'option3' and put them in a HTML form select input?
  Solution 1  
The following search pattern can be employed:
<form>
    <select>
        %SEARCH{
            "^\|[^\|]*\| *option *\|"
            topic="%TOPIC%"
            type="regex"
            multiple="on"
            nonoise="on"
            format="<option>$pattern(^\| *(.*?) *\|.*)</option>"
        }%
    </select>
</form>
 
which is, in effect:
  Solution 2  
If your table has this format:
| *Country*      |
|                |
| Afghanistan    |
| Aland Islands  |
| Albania        |
| Algeria        |
| American Samoa |
| Andorra        |
 
You need to skip the header row. Use this search:
<select>
    %SEARCH{
        "^\|[^\*\|]*\|"
        topic="CountryList"
        type="regex"
        multiple="on"
        nonoise="on"
        format="<option>$pattern(^\| *(.*?) *\|.*)</option>"
    }%
</select>
 
Which renders as:
    Afghanistan 
Aland Islands 
Albania 
Algeria 
American Samoa 
Andorra 
Angola 
Anguilla 
Antarctica 
Antigua and Barbuda 
Argentina 
Armenia 
Aruba 
Australia 
Austria 
Azerbaijan 
Bahamas 
Bahrain 
Bangladesh 
Barbados 
Belarus 
Belgium 
Belize 
Benin 
Bermuda 
Bhutan 
Bolivia 
Bosnia and Herzegovina 
Botswana 
Bouvet Island 
Brazil 
British Indian Ocean Territory 
British Virgin Islands 
Brunei 
Bulgaria 
Burkina Faso 
Burundi 
Cambodia 
Cameroon 
Canada 
Cape Verde 
Cayman Islands 
Central African Republic 
Chad 
Chile 
China 
Christmas Island 
Cocos Islands 
Colombia 
Comoros 
Congo - Brazzaville 
Congo - Kinshasa 
Cook Islands 
Costa Rica 
Croatia 
Cuba 
Cyprus 
Czech Republic 
Denmark 
Djibouti 
Dominica 
Dominican Republic 
East Timor 
Ecuador 
Egypt 
El Salvador 
Equatorial Guinea 
Eritrea 
Estonia 
Ethiopia 
Falkland Islands 
Faroe Islands 
Fiji 
Finland 
France 
French Guiana 
French Polynesia 
French Southern Territories 
Gabon 
Gambia 
Georgia 
Germany 
Ghana 
Gibraltar 
Greece 
Greenland 
Grenada 
Guadeloupe 
Guam 
Guatemala 
Guernsey 
Guinea 
Guinea-Bissau 
Guyana 
Haiti 
Heard Island and McDonald  Islands 
Honduras 
Hong Kong 
Hungary 
Iceland 
India 
Indonesia 
Iran 
Iraq 
Ireland 
Isle of Man 
Israel 
Italy 
Ivory Coast 
Jamaica 
Japan 
Jersey 
Jordan 
Kazakhstan 
Kenya 
Kiribati 
Kuwait 
Kyrgyzstan 
Laos 
Latvia 
Lebanon 
Lesotho 
Liberia 
Libya 
Liechtenstein 
Lithuania 
Luxembourg 
Macao 
Macedonia 
Madagascar 
Malawi 
Malaysia 
Maldives 
Mali 
Malta 
Marshall Islands 
Martinique 
Mauritania 
Mauritius 
Mayotte 
Mexico 
Micronesia 
Moldova 
Monaco 
Mongolia 
Montenegro 
Montserrat 
Morocco 
Mozambique 
Myanmar 
Namibia 
Nauru 
Nepal 
Netherlands 
Netherlands Antilles 
New Caledonia 
New Zealand 
Nicaragua 
Niger 
Nigeria 
Niue 
Norfolk Island 
North Korea 
Northern Mariana Islands 
Norway 
Oman 
Pakistan 
Palau 
Palestinian Territory 
Panama 
Papua New Guinea 
Paraguay 
Peru 
Philippines 
Pitcairn 
Poland 
Portugal 
Puerto Rico 
Qatar 
Reunion 
Romania 
Russia 
Rwanda 
Saint Barthélemy 
Saint Helena 
Saint Kitts and Nevis 
Saint Lucia 
Saint Martin 
Saint Pierre and Miquelon 
Saint Vincent and the Grenadines 
Samoa 
San Marino 
Sao Tome and Principe 
Saudi Arabia 
Senegal 
Serbia 
Seychelles 
Singapore 
Slovakia 
Slovenia 
Solomon Islands 
Somalia 
South Africa 
South Georgia and the South Sandwich Islands 
South Korea 
Spain 
Sri Lanka 
Sudan 
Suriname 
Svalbard and Jan Mayen 
Swaziland 
Sweden 
Switzerland 
Syria 
Taiwan 
Tajikistan 
Tanzania 
Thailand 
Togo 
Tokelau 
Tonga 
Trinidad and Tobago 
Tunisia 
Turkey 
Turkmenistan 
Turks and Caicos Islands 
Tuvalu 
U.S. Virgin Islands 
Uganda 
Ukraine 
United Arab Emirates 
United Kingdom 
United States 
United States Minor Outlying Islands 
Uruguay 
Uzbekistan 
Vanuatu 
Vatican 
Venezuela 
Vietnam 
Wallis and Futuna 
Western Sahara 
Yemen 
Zambia 
Zimbabwe 
 
  Solution 3  
If you want to grab the complete row for each occurrence of a string in a table, for instance the word "Marketing":
| a | b | c | d | e |
| Marketing | b | c | d | e|
| a | b | c | d | e |
| a | marketing | c | d | e | 
| a | b | c | d | marketing | 
 
use this query:
%SEARCH{
    "^\|.*?Marketing.*"
    type="regex"
    topic="%TOPIC%"
    multiple="on"
    nonoise="on"
    format="| $pattern(^\| *(.*?) *|.*)"
}%
 
Which renders as:
	
		
			 Marketing  
			 b  
			 c  
			 d  
			 e  
		 
		
			 a  
			 marketing  
			 c  
			 d  
			 e  
		 
		
			 a  
			 b  
			 c  
			 d  
			 marketing  
		 
	 
  Problem  
Imagine a form-based topic classification, i.e. every page has a form with several fields. How to: 
 create a search to display all topics where one form field is set to a certain value
   create a search to filter the list above based on the values of a second form field
   
  Test case  
In practice: 
Image a form with two fields: 
 TopicClassification = One, Two or Three
   TopicStatus = Test or Final
   
We will: 
 List all topics where the TopicClassification field is set to 'Two'
   Enable the user to filter this list based on the values of TopicStatus
   
  Solution  
%SEARCH{
    "TopicClassification='%URLPARAM{type}%'"
    type="query"
    nonoise="on"
    sort="topic"
    format="   * $topic - <font face='arial,helvetica' size='1'> 
    _last modified by_ $wikiusername _on_ $date </font> %BR%     
    <font face='arial,helvetica' size='1'> $formfield(TopicStatus) </font>" 
}%
 
The filtering select dialogue is created as in Pattern 1:
%STARTSIDEBAR%
*Filter:* %BR%
<form name="selectType" action="%SCRIPTURLPATH{"view"}%/%WEB%/" >
    <select name="type" size="1" onchange="document.location=this.value;"> 
        %SEARCH{
            "^\|[^\|]*\| *option *\|"
            topic="TopicClassification"
            type="regex" 
            nonoise="on"
            format="<option value='%BASETOPIC%?type=$pattern(^\| *(.*?) *\|.*)'>
                $pattern(^\| *(.*?) *\|.*)</option>"
        }% 
        <option value='%BASETOPIC%'>All pages</option>
    </select>
</form>
%STOPSIDEBAR% 
 
This will create similar functionality as 
Foswiki:Extensions.TopicClassificationAddOn 
  Problem  
How to get to the parent of the current topic to display on the page?
  Solution 1: Using QUERY  
Use the QUERY macro:
%QUERY{ "parent.name" }%
  Test case  
FormattedSearch 
  Pattern 4: Show all Children of a given topic  
  Problem  
How to get to the list of all children of the current topic to display on the page?
  Solution  
The parent information is stored in the topic meta data. Do a SEARCH to find all topic parent meta data pointing to the current topic:
Children:
%SEARCH{
    "parent.name='%TOPIC%'"
    type="query"
    nonoise="on"
    format="[[$topic]]"
    separator=", "
}%
 
Note:  Replace 
%TOPIC% with 
%BASETOPIC% if you put this SEARCH into the skin or a sidebar.
See also 
HierarchicalNavigation  for an elaborate example.
  Pattern 5: Search and display the home topics of public webs in a list  
  Problem  
How to find and display public webs in a drop down list box.
  Solution  
<form>
    <select name="topic">
        <option value="%TOPIC%">Select...</option>
            %SEARCH{
                "%HOMETOPIC%"
                scope="topic"
                web="all"
                topic="%HOMETOPIC%"
                format="<option value='$web.$topic'>$web</option>"
                separator=" "
            }%
    </select>
    <input type="submit" class="foswikiSubmit" value="Go" />
</form>
 
  Test case  
Public webs can be found with the %WEBLIST% macro.
  Pattern 6: Create a select box with values from a bullet list  
  Problem  
We have a topic with a bullet list with category names. In another topic we want to offer these values in a select box dropdown.
For example, CategoryList has: 
 Clients
   People
   Rooms
   Buildings
   
  Solution  
The following search pattern can be employed:
<select name="type">
    <option>Select category...</option>
    %SEARCH{
        "   *\s*.*?"
        topic="CategoryList"
        type="regex"
        multiple="on"
        casesensitive="on"
        nonoise="on"
        format="<option>$pattern(.*   \*\s*([^\n]*).*)</option>"
    }%
</select>
 
To render the bullet list as a comma-separated list, use the 
separator parameter:
%SEARCH{
    "   *\s*.*?"
    topic="CategoryList"
    type="regex"
    multiple="on"
    casesensitive="on"
    nonoise="on"
    separator=","
    format="$pattern(.*   \*\s*([^\n]*).*)"
}%
 
  Pattern 7: Search all topics that have been moved  
  Problem  
How would I go about listing all moved topics ?
  Solution  
Search for the 'moved' meta data. Type this: 
Moved topics: %SEARCH{
    "moved.from=~'\w+'"
    web="all"
    type="query"
    separator=", "
    format="$web.$topic"
    nonoise="on"
}%
 
  Test case  
Moved topics: 
AppendixCascadingStyleSheets , 
FAQAnApplicationWithWikiForm , 
FAQDeleteOrRenameATopic , 
FAQDeleteOrRenameAnAttachment , 
FAQDownloadSources , 
FAQEditDoesNotIncreaseTheRevision , 
FAQGnuGeneralPublicLicense , 
FAQSearchDoesNotWork , 
FAQSimultaneousEdits , 
FAQWhatIsWikiWiki , 
VarMETASEARCH 
  Solution  
Use the 
$pattern() token. Type this:
%SEARCH{
    "^---[+][^+][^\r\n]+[\r\n]"
    type="regex"
    nonoise="on"
    header="Headings:"
    limit="5"
    format="   * [[$topic][$pattern([\r\n\-+!]+([^\r\n]*?)[\r\n].*)]]"
    footer="Found $ntopics topics with level-1 headings"
}% 
  Test case  
Headings: 
 
Found 5 topics with level-1 headings
Related Topics:  UserDocumentationCategory , 
SearchHelp , 
Macros , 
FormattedSearch , 
RegularExpression