Files
cligen/docs/CliGen/Regex.html

546 lines
18 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Crystal Docs 1.20.3">
<meta name="crystal_docs.project_version" content="object_rework-dev">
<meta name="crystal_docs.project_name" content="CliGenerator">
<link href="../css/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../js/doc.js"></script>
<meta name="repository-name" content="CliGenerator">
<title>CliGen::Regex - CliGenerator object_rework-dev</title>
<script type="text/javascript">
CrystalDocs.base_path = "../";
</script>
</head>
<body>
<svg class="hidden">
<symbol id="octicon-link" viewBox="0 0 16 16">
<path fill="currentColor" fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path>
</symbol>
</svg>
<input type="checkbox" id="sidebar-btn">
<label for="sidebar-btn" id="sidebar-btn-label">
<svg class="open" xmlns="http://www.w3.org/2000/svg" height="2em" width="2em" viewBox="0 0 512 512"><title>Open Sidebar</title><path fill="currentColor" d="M80 96v64h352V96H80zm0 112v64h352v-64H80zm0 112v64h352v-64H80z"></path></svg>
<svg class="close" xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" viewBox="0 0 512 512"><title>Close Sidebar</title><path fill="currentColor" d="m118.6 73.4-45.2 45.2L210.7 256 73.4 393.4l45.2 45.2L256 301.3l137.4 137.3 45.2-45.2L301.3 256l137.3-137.4-45.2-45.2L256 210.7Z"></path></svg>
</label>
<div class="sidebar">
<div class="sidebar-header">
<div class="search-box">
<input type="search" class="search-input" placeholder="Search..." spellcheck="false" aria-label="Search">
</div>
<div class="project-summary">
<h1 class="project-name">
<a href="../index.html">
CliGenerator
</a>
</h1>
<span class="project-version">
object_rework-dev
</span>
</div>
</div>
<div class="search-results hidden">
<ul class="search-list"></ul>
</div>
<div class="types-list">
<ul>
<li class="parent open current" data-id="CliGenerator/CliGen" data-name="cligen">
<a href="../CliGen.html">CliGen</a>
<ul>
<li class=" " data-id="CliGenerator/CliGen/App" data-name="cligen::app">
<a href="../CliGen/App.html">App</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Arg" data-name="cligen::arg">
<a href="../CliGen/Arg.html">Arg</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ArgReprocessedError" data-name="cligen::argreprocessederror">
<a href="../CliGen/ArgReprocessedError.html">ArgReprocessedError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Argument" data-name="cligen::argument">
<a href="../CliGen/Argument.html">Argument</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/BaseCommandNode" data-name="cligen::basecommandnode">
<a href="../CliGen/BaseCommandNode.html">BaseCommandNode</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/BaseFlag" data-name="cligen::baseflag">
<a href="../CliGen/BaseFlag.html">BaseFlag</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Coercable" data-name="cligen::coercable">
<a href="../CliGen/Coercable.html">Coercable</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Command" data-name="cligen::command">
<a href="../CliGen/Command.html">Command</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/CommandInfo" data-name="cligen::commandinfo">
<a href="../CliGen/CommandInfo.html">CommandInfo</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/CommandMeta" data-name="cligen::commandmeta">
<a href="../CliGen/CommandMeta.html">CommandMeta</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/CommandNode" data-name="cligen::commandnode(t)">
<a href="../CliGen/CommandNode.html">CommandNode</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Common" data-name="cligen::common">
<a href="../CliGen/Common.html">Common</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ConfigurationError" data-name="cligen::configurationerror">
<a href="../CliGen/ConfigurationError.html">ConfigurationError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/DuplicateCommandError" data-name="cligen::duplicatecommanderror">
<a href="../CliGen/DuplicateCommandError.html">DuplicateCommandError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/DuplicateFlagError" data-name="cligen::duplicateflagerror">
<a href="../CliGen/DuplicateFlagError.html">DuplicateFlagError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Error" data-name="cligen::error">
<a href="../CliGen/Error.html">Error</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Flag" data-name="cligen::flag(t)">
<a href="../CliGen/Flag.html">Flag</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagArgumentError" data-name="cligen::flagargumenterror">
<a href="../CliGen/FlagArgumentError.html">FlagArgumentError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagBundleError" data-name="cligen::flagbundleerror">
<a href="../CliGen/FlagBundleError.html">FlagBundleError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagMeta" data-name="cligen::flagmeta">
<a href="../CliGen/FlagMeta.html">FlagMeta</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagMissingArgumentError" data-name="cligen::flagmissingargumenterror">
<a href="../CliGen/FlagMissingArgumentError.html">FlagMissingArgumentError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/FlagNotFoundError" data-name="cligen::flagnotfounderror">
<a href="../CliGen/FlagNotFoundError.html">FlagNotFoundError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Format" data-name="cligen::format">
<a href="../CliGen/Format.html">Format</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/HelpRequestedError" data-name="cligen::helprequestederror">
<a href="../CliGen/HelpRequestedError.html">HelpRequestedError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/InternalError" data-name="cligen::internalerror">
<a href="../CliGen/InternalError.html">InternalError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/InternalVar" data-name="cligen::internalvar">
<a href="../CliGen/InternalVar.html">InternalVar</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/InvalidFlagValueError" data-name="cligen::invalidflagvalueerror">
<a href="../CliGen/InvalidFlagValueError.html">InvalidFlagValueError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/InvalidOptionError" data-name="cligen::invalidoptionerror">
<a href="../CliGen/InvalidOptionError.html">InvalidOptionError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/MatchType" data-name="cligen::matchtype">
<a href="../CliGen/MatchType.html">MatchType</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/MissingDispatchError" data-name="cligen::missingdispatcherror">
<a href="../CliGen/MissingDispatchError.html">MissingDispatchError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/MissingRequiredFlagError" data-name="cligen::missingrequiredflagerror">
<a href="../CliGen/MissingRequiredFlagError.html">MissingRequiredFlagError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Parsable" data-name="cligen::parsable">
<a href="../CliGen/Parsable.html">Parsable</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ParseableInvariantError" data-name="cligen::parseableinvarianterror">
<a href="../CliGen/ParseableInvariantError.html">ParseableInvariantError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/PreRunCommand" data-name="cligen::preruncommand">
<a href="../CliGen/PreRunCommand.html">PreRunCommand</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ProxyCommand" data-name="cligen::proxycommand">
<a href="../CliGen/ProxyCommand.html">ProxyCommand</a>
</li>
<li class=" current" data-id="CliGenerator/CliGen/Regex" data-name="cligen::regex">
<a href="../CliGen/Regex.html">Regex</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/RegexInvariantError" data-name="cligen::regexinvarianterror">
<a href="../CliGen/RegexInvariantError.html">RegexInvariantError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ReservedFlagError" data-name="cligen::reservedflagerror">
<a href="../CliGen/ReservedFlagError.html">ReservedFlagError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/RunCommand" data-name="cligen::runcommand">
<a href="../CliGen/RunCommand.html">RunCommand</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/RuntimeError" data-name="cligen::runtimeerror">
<a href="../CliGen/RuntimeError.html">RuntimeError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/SubCommand" data-name="cligen::subcommand">
<a href="../CliGen/SubCommand.html">SubCommand</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/SubCommandInfo" data-name="cligen::subcommandinfo">
<a href="../CliGen/SubCommandInfo.html">SubCommandInfo</a>
</li>
<li class="parent " data-id="CliGenerator/CliGen/Timeparse" data-name="cligen::timeparse">
<a href="../CliGen/Timeparse.html">Timeparse</a>
<ul>
<li class=" " data-id="CliGenerator/CliGen/Timeparse/OperationUnit" data-name="cligen::timeparse::operationunit">
<a href="../CliGen/Timeparse/OperationUnit.html">OperationUnit</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Timeparse/RelativeOperation" data-name="cligen::timeparse::relativeoperation">
<a href="../CliGen/Timeparse/RelativeOperation.html">RelativeOperation</a>
</li>
</ul>
</li>
<li class=" " data-id="CliGenerator/CliGen/TimeParseError" data-name="cligen::timeparseerror">
<a href="../CliGen/TimeParseError.html">TimeParseError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/Trigger" data-name="cligen::trigger">
<a href="../CliGen/Trigger.html">Trigger</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/UnknownCommandNodeError" data-name="cligen::unknowncommandnodeerror">
<a href="../CliGen/UnknownCommandNodeError.html">UnknownCommandNodeError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/UnknownFlagError" data-name="cligen::unknownflagerror">
<a href="../CliGen/UnknownFlagError.html">UnknownFlagError</a>
</li>
<li class=" " data-id="CliGenerator/CliGen/ValidationError" data-name="cligen::validationerror">
<a href="../CliGen/ValidationError.html">ValidationError</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="main-content">
<h1 class="type-name">
<span class="kind">
module
</span> CliGen::<wbr>Regex
</h1>
<h2>
<a id="defined-in" class="anchor" href="#defined-in">
<svg class="octicon-link" aria-hidden="true">
<use href="#octicon-link"/>
</svg>
</a>
Defined in:
</h2>
cligen/regex.cr
<br/>
<h2>
<a id="constant-summary" class="anchor" href="#constant-summary">
<svg class="octicon-link" aria-hidden="true">
<use href="#octicon-link"/>
</svg>
</a>
Constant Summary
</h2>
<dl>
<dt class="entry-const" id="DATE">
<strong>DATE</strong> = <code><span class="s">/(?&lt;date&gt;(?&lt;year&gt;[0-9]{4})-(?&lt;month&gt;[0-9]{2})-(?&lt;day&gt;[0-9]{2}))/</span></code>
</dt>
<dt class="entry-const" id="EPOCH">
<strong>EPOCH</strong> = <code><span class="s">/@(?&lt;epoch&gt;[0-9]+)/</span></code>
</dt>
<dt class="entry-const" id="FLAG_LONG">
<strong>FLAG_LONG</strong> = <code><span class="s">/^--[a-zA-Z0-9][a-zA-Z0-9-_]+$/</span></code>
</dt>
<dt class="entry-const" id="FLAG_MULTIPLE_SHORT">
<strong>FLAG_MULTIPLE_SHORT</strong> = <code><span class="s">/^-[a-zA-Z][a-zA-Z]+$/</span></code>
</dt>
<dt class="entry-const" id="FLAG_REGEX">
<strong>FLAG_REGEX</strong> = <code><span class="s">/^(-[a-zA-Z]|--[a-zA-Z-_0-9]+)$/</span></code>
</dt>
<dt class="entry-const" id="FLAG_SHORT">
<strong>FLAG_SHORT</strong> = <code><span class="s">/^-[a-zA-Z]$/</span></code>
</dt>
<dt class="entry-const" id="FLAG_WITH_ARG">
<strong>FLAG_WITH_ARG</strong> = <code><span class="s">/^(?&lt;flag&gt;(-[a-zA-Z]|--[a-zA-Z0-9][a-zA-Z0-9-_]+))=&quot;?(?&lt;arg&gt;.+?)&quot;?$/</span></code>
</dt>
<dt class="entry-const" id="FLOAT">
<strong>FLOAT</strong> = <code><span class="s">/^[-+]?[[:digit:]]+(\.[[:digit:]]+)?$/</span></code>
</dt>
<dt class="entry-const" id="INPUT_DATE_EPOCH">
<strong>INPUT_DATE_EPOCH</strong> = <code><span class="s">/^</span><span class="i">#{</span><span class="t">EPOCH</span><span class="i">}</span><span class="s">(\s+</span><span class="i">#{</span><span class="t">TIMEZONE</span><span class="i">}</span><span class="s">)?$/</span></code>
</dt>
<dt class="entry-const" id="INPUT_DATE_FULL">
<strong>INPUT_DATE_FULL</strong> = <code><span class="s">/^</span><span class="i">#{</span><span class="t">DATE</span><span class="i">}</span><span class="s">\s+</span><span class="i">#{</span><span class="t">TIME</span><span class="i">}</span><span class="s">(\s+</span><span class="i">#{</span><span class="t">TIMEZONE</span><span class="i">}</span><span class="s">)?$/</span></code>
</dt>
<dd class="entry-const-doc">
<hr />
<h2><a id="datetime-matchers-fully-anchored-so-a-partial-match-cant-slip-through." class="anchor" href="#datetime-matchers-fully-anchored-so-a-partial-match-cant-slip-through.">
<svg class="octicon-link" aria-hidden="true">
<use href="#octicon-link"/>
</svg>
</a>Date/time matchers - fully anchored so a partial match can't slip through.</h2>
</dd>
<dt class="entry-const" id="INPUT_DATE_SIMPLE">
<strong>INPUT_DATE_SIMPLE</strong> = <code><span class="s">/^</span><span class="i">#{</span><span class="t">DATE</span><span class="i">}</span><span class="s">(\s+</span><span class="i">#{</span><span class="t">TIMEZONE</span><span class="i">}</span><span class="s">)?$/</span></code>
</dt>
<dt class="entry-const" id="INPUT_RELATIVE_OPERATIONS">
<strong>INPUT_RELATIVE_OPERATIONS</strong> = <code><span class="s">/^(?&lt;operations&gt;(</span><span class="i">#{</span><span class="t">RELATIVE</span><span class="i">}</span><span class="s">\s*)+)(\s+</span><span class="i">#{</span><span class="t">TIMEZONE</span><span class="i">}</span><span class="s">)?$/</span></code>
</dt>
<dt class="entry-const" id="INT">
<strong>INT</strong> = <code><span class="s">/^[-+]?[[:digit:]]+$/</span></code>
</dt>
<dt class="entry-const" id="RELATIVE">
<strong>RELATIVE</strong> = <code><span class="s">/[+-][0-9]+\s+(seconds?|minutes?|hours?|days?|weeks?|months?|years?)/</span></code>
</dt>
<dt class="entry-const" id="RELATIVE_OPERATION">
<strong>RELATIVE_OPERATION</strong> = <code><span class="s">/(?&lt;sign&gt;[+-])(?&lt;quantity&gt;[0-9]+)\s+(?&lt;unit&gt;seconds?|minutes?|hours?|days?|weeks?|months?|years?)/</span></code>
</dt>
<dd class="entry-const-doc">
<hr />
<h2><a id="relative-operation-matcher-for-use-with-cli-gentimeparserelative-operation" class="anchor" href="#relative-operation-matcher-for-use-with-cli-gentimeparserelative-operation">
<svg class="octicon-link" aria-hidden="true">
<use href="#octicon-link"/>
</svg>
</a>Relative Operation matcher - For use with CliGen::Timeparse::RelativeOperation</h2>
</dd>
<dt class="entry-const" id="TIME">
<strong>TIME</strong> = <code><span class="s">/(?&lt;time&gt;(?&lt;hour&gt;[0-9]{2}):(?&lt;minute&gt;[0-9]{2}):(?&lt;second&gt;[0-9]{2}))/</span></code>
</dt>
<dt class="entry-const" id="TIMEZONE">
<strong>TIMEZONE</strong> = <code><span class="s">/(?&lt;timezone&gt;(?&lt;offset_sign&gt;[-+])(?&lt;offset_hour&gt;[01][0-9]|2[0-3])(?&lt;offset_minute&gt;[0-5][0-9]))/</span></code>
</dt>
<dd class="entry-const-doc">
<hr />
<p>Date/time components.</p>
<p>These are building blocks ONLY — they are interpolated into the anchored
matchers below and must stay unanchored. Interpolating a Regex renders it
as <code>(?-imsx:...)</code>, so an anchor here would end up buried mid-pattern in the
composites (<code>^(?-imsx:^...$)\s+...$</code>) and could never match.</p>
<h2><a id="never-match-user-input-against-these-directly-use-the-input-date-matchers-which-are-anchored." class="anchor" href="#never-match-user-input-against-these-directly-use-the-input-date-matchers-which-are-anchored.">
<svg class="octicon-link" aria-hidden="true">
<use href="#octicon-link"/>
</svg>
</a>Never match user input against these directly — use the INPUT_DATE_*
matchers, which are anchored.</h2>
<p>Hour is bounded 00-23 and minute 00-59 so the largest representable offset
is 23:59 (86340s), which stays inside Time::Location.fixed's +/-24h limit.
Without these bounds an offset like -9999 passes the match and then raises
Time::Location::InvalidTimezoneOffsetError - a non-CliGen exception that
escapes App#handle_command_raises and reaches the user as a stack trace.</p>
</dd>
<dt class="entry-const" id="UINT">
<strong>UINT</strong> = <code><span class="s">/^[[:digit:]]+$/</span></code>
</dt>
</dl>
<div class="methods-inherited">
</div>
</div>
</body>
</html>