This form will send @zbanks your current query, your browser name, and the above text.
Noodle is a tool to find words or phrases that match certain conditions.
It’s similar to Regular Expressions, Nutrimatic, qhex Word Play, or Qat.
a or A – the letter a itself (case-insensitive)' (apostrophe) – any punctuation, such as an apostrophe, dash, or period._ (underscore) – space (word boundary). – any letter[abc] or [a-c] – one of a, b, or c[^abc] – one letter except a, b, or c* – zero or more copies of the previous symbol+ – one or more copies of the previous symbol? – one or zero copies of the previous symbol{3} – exactly three copies of the previous symbol{3,} – at least three copies of the previous symbol{,5} – at most five copies of the previous symbol{3,5} – between three and five (inclusive) copies of the previous symbol(abcd) – group of abcd, usually used with *, +, ?, or {…}.(ab|cd|ef) – either ab, cd, or ef<ate> – anagram of ate: ate, eat, eta, tea<ate+> – superanagram of ate: abate, acute, fated, neat, …<ate+3> – transadd of 3 to ate: abated, advent, basket, …<ate-> – subanagram of ate: ate, at, a, eat, …<ate-1> – transdelete of 1 to ate: at, Ta(ate:-) – subset of ate: ate, at, a(ate:+) – superset of ate: abate, acted, fated, …(abcd:^) – substring of abcd: a, cd!_ – use explicit spaces for this line!' – use explicit punctuation for this line!1 – use fuzzy search for this line, within an edit distance of 14 5 on its own line – enumeration: match 4 letters, a space, then 5 lettersVOWEL=[aeiou] on its own line – define a macro VOWEL to use in later lines//, /*…*/ – comment, ignore text (like in C, Javascript, etc.); – separates expressions on the same line, equivalent to starting a new line#limit 50 on its own line – a pragma to control query-wide options like result count or wordlistSpecify filters in the input textbox. Each line is treated as a separate noodle expression; you can also fit multiple expressions on one line by separating them with a semicolon (;), which is useful when a text field doesn’t allow newlines (e.g. a spreadsheet formula). Only results that match all expressions are returned, so more lines/expressions means a more specific (and usually slower) query.
The query runs until one of the following:
#words)#limit)GET API; see Google Sheets Integration)Stop button is pressedNew to Noodle? Start with a single word-shaped expression like .{5} or crossword, then layer on constraints (anagram banks, enumerations, fuzzy matching) one at a time – each additional line narrows the results further, and it’s easier to tell which line is responsible for an unexpected (or missing) result if you add them incrementally.
Noodle supports the following regular expression syntax: […], [^…], ., *, +, ?, (…), |, {…}.
Before matching, words are converted to lowercase and stripped of whitespace and non-alphabetical symbols (punctuation, numbers).
To explicitly match spaces, include “!_” at the end of the expression. When enabled, spaces can be explicitly matched with the “_” character.
To explicitly match other symbols, include “!'” at the end of the expression. When enabled, these symbols can be matched with the “'” character.
Regardless of setting, and unlike normal regular expressions, the period (“.”) is only equivalent to “[a-z]”. To match any symbol, use “[a-z'_]”.
Noodle expressions do not support backreferences (e.g. “\1”). Additionally, because the input is pre-processed to have a limited alphabet, noodle expressions do not support escape characters, or character classes like “[:alpha:]”.
Noodle has additional support for anagram-like constraints with angle bracket syntax: <...>
<abcd> – anagram of abcd: rearranging the given letters<abcd+> – superanagram of abcd: rearranging at least the given letters<abcd+3> – transadd of 3 to abcd: rearranging all of the given letters plus N wildcards<abcd-> – subanagram of abcd: rearranging at most the given letters<abcd-1> – transdelete of 1 to abcd: rearranging all but N of the given letters(abcd:-) – subset of abcd: contained within a subset of the given expression, in the same order(abcd:+) – superset of abcd: contains the superset of the given expression, in the same order(abcd:^) – substring of abcd: contained within the given expression (consecutively)The <...> forms only accept a literal bank of letters (e.g. <abcd>, not <(ab|cd)>) – for these, order doesn’t matter at all, only which letters are available. The (...:-), (...:+), and (...:^) forms instead accept a nested expression (letters, [classes], (groups), etc.) and preserve its order, just allowing letters to be skipped, inserted, or restricted to a contiguous run, respectively.
Anagram constraints are not compatible with fuzzy matching, and may result in false positives (but not false negatives!).
Bare numbers are a shortcut to define an enumeration.
The expression 3 3 8 7 looks for a 4-word phrase, consisting of two 3-letter words, followed by an 8-letter word, then a 7-letter word.
Noodle supports performing fuzzy matching for certain expressions.
This will find words & phrases that would match within a given edit distance of the expression.
To allow matches within edit distance 2, include “!2” at the end of the expression.
Fuzzy matching can make queries take much longer, so it works best when there are additional constraints.
If there are multiple constraints with fuzzy matching, the edits between expressions may not be consistent. For example, "hey" will match the query "hen !1; hay !1" even though the edits to get to “hen” or “hay” are different.
Anagram-like constraints (“<…>”) are incompatible with fuzzy matching, and may produce false positives.
Macros allow you to define a common subexpression, which can be useful when working with repeated letters from a letterbank.
Macros are defined with NAME=expression... syntax on their own lines.
Macros are substituted in later lines before parsing, using a naive find-replace in the order they are defined.
STATE=(al|ak|az|ar|ca|co|ct|de|fl|ga|hi|id|il|in|ia|ks|ky|la|me|md|ma|mi|mn|ms|mo|mt|ne|nv|nh|nj|nm|ny|nc|nd|oh|ok|or|pa|ri|sc|sd|tn|tx|ut|vt|va|wa|wv|wi|wy)ELEMENT=(h|he|li|be|b|c|n|o|f|ne|na|mg|al|si|p|s|cl|ar|k|ca|sc|ti|v|cr|mn|fe|co|ni|cu|zn|ga|ge|as|se|br|kr|rb|sr|y|zr|nb|mo|tc|ru|rh|pd|ag|cd|in|sn|sb|te|i|xe|cs|ba|hf|ta|w|re|os|ir|pt|au|hg|tl|pb|bi|po|at|rn|fr|ra|rf|db|sg|bh|hs|mt|ds|rg|cn|uut|fl|uup|lv|uus|uuo|la|ce|pr|nd|pm|sm|eu|gd|tb|dy|ho|er|tm|yb|lu|ac|th|pa|u|np|pu|am|cm|bk|cf|es|fm|md|no|lr)Pragmas are query-wide options, written as their own line starting with #. Unlike expressions, a pragma doesn’t filter results itself – it changes how the whole query runs. They’re what the Query Controls in the UI actually add to your query behind the scenes, so you usually don’t need to type them by hand unless you’re scripting queries (e.g. the Google Sheets Integration) or want a query that’s reproducible as plain text.
#words 5 – combine at most 5 words into a matching phrase (default: 10)#limit 50 – stop after 50 results (default: 100 in the web UI; see Basics for other interfaces)#dict scrabble – search the scrabble wordlist instead of the default one; see Wordlist for the full list of names#dedupe – only return the first word-order permutation of each matching phrase (e.g. for an anagram query, don’t also return reorderings of the same words)#wordlist followed by one word per line – replace the wordlist entirely with the words that follow, for this query only. Since every line after #wordlist is read as a word rather than a pragma/expression, it must come last – any #words/#limit/#dict/#dedupe needs to appear above it.Ctrl-Enter – submit queryThe controls above the input textbox set query-wide options without needing to type a pragma by hand:
#words)#limit)#dict)#dedupe)#wordlist)Next to each result, there are 3 links to common actions:
c – copy the result to the clipboardg – look up the result on Googlew – look up the result on Wikipediax – look up the result as a clue on Crossword SolverYou can query Noodle directly from Google Sheets! Here’s an example formula:
=IMPORTDATA(CONCAT("https://noodle.fly.dev/query/", ENCODEURL("yourqueryhere")))
You can wrap it in TRANSPOSE(...) to have it fill out horizontally instead of vertically.
Since a formula’s query argument is a single string, use ; (not a newline) to separate multiple expressions – see Basics.
This plaintext GET endpoint has a shorter 10 second timeout, and defaults to only 15 results; raise the latter with the #limit pragma, e.g. #limit 100;<abcd+>.
The input wordlists are described below, and can be downloaded by following these links:
It is based on the Debian wordlist, Wikipedia, and Wiktionary.
Noodle is open-source and released under the MIT license.
Visit GitHub to fork the code or submit bugs. There is also a command-line version available for running offline/locally.