Von*_*onC 45
根据生成正则表达式以匹配任意数值范围,并在Regex_For_Range为您的示例生成此类正则表达式之后:
\b0*(1[1-9][0-9]|[2-9][0-9]{2}|1[0-9]{3}|2[01][0-9]{2}|22[0-2][0-9]|223[0-4])\b
Run Code Online (Sandbox Code Playgroud)
会做的伎俩.
该过程将(仍然遵循该Regex生成器):
首先,分成相等的长度范围:
110 - 999
1000 - 2234
Run Code Online (Sandbox Code Playgroud)
其次,闯入产生简单正则表达式的范围:
110 - 199
200 - 999
1000 - 1999
2000 - 2199
2200 - 2229
2230 - 2234
Run Code Online (Sandbox Code Playgroud)
将每个范围转换为正则表达式:
1[1-9][0-9]
[2-9][0-9]{2}
1[0-9]{3}
2[01][0-9]{2}
22[0-2][0-9]
223[0-4]
Run Code Online (Sandbox Code Playgroud)
折叠相邻的10:1 [1-9] [0-9] [2-9] [0-9] {2} 1 [0-9] {3} 2 [01] [0-9] {2 22 [0-2] [0-9] 223 [0-4]
结合上面的正则表达式产生:
0*(1[1-9][0-9]|[2-9][0-9]{2}|1[0-9]{3}|2[01][0-9]{2}|22[0-2][0-9]|223[0-4])
Run Code Online (Sandbox Code Playgroud)
接下来我们将尝试使用树来分解公共前缀:
根据正则表达式前缀解析为树:
. 1 [1-9] [0-9]
+ [0-9]{3}
+ [2-9] [0-9]{2}
+ 2 [01] [0-9]{2}
+ 2 [0-2] [0-9]
+ 3 [0-4]
Run Code Online (Sandbox Code Playgroud)
将解析树转换为正则表达式产生:
0*(1([1-9][0-9]|[0-9]{3})|[2-9][0-9]{2}|2([01][0-9]{2}|2([0-2][0-9]|3[0-4])))
Run Code Online (Sandbox Code Playgroud)
我们选择较短的一个作为结果.
\b0*(1[1-9][0-9]|[2-9][0-9]{2}|1[0-9]{3}|2[01][0-9]{2}|22[0-2][0-9]|223[0-4])\b
Run Code Online (Sandbox Code Playgroud)
Wik*_*żew 10
由于在线号码范围正则表达式生成器服务通常在一段时间后变得不可用(这个在撰写本文时
\n如何:
\nRun code snippet!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).toRegexRange=e()}}(function(){return function(){return function e(t,n,r){function i(u,a){if(!n[u]){if(!t[u]){var s="function"==typeof require&&require;if(!a&&s)return s(u,!0);if(o)return o(u,!0);var c=new Error("Cannot find module \'"+u+"\'");throw c.code="MODULE_NOT_FOUND",c}var f=n[u]={exports:{}};t[u][0].call(f.exports,function(e){return i(t[u][1][e]||e)},f,f.exports,e,t,n,r)}return n[u].exports}for(var o="function"==typeof require&&require,u=0;u<r.length;u++)i(r[u]);return i}}()({1:[function(e,t,n){"use strict";const r=e("is-number"),i=(e,t,n)=>{if(!1===r(e))throw new TypeError("toRegexRange: expected the first argument to be a number");if(void 0===t||e===t)return String(e);if(!1===r(t))throw new TypeError("toRegexRange: expected the second argument to be a number.");let o={relaxZeros:!0,...n};"boolean"==typeof o.strictZeros&&(o.relaxZeros=!1===o.strictZeros);let s=e+":"+t+"="+String(o.relaxZeros)+String(o.shorthand)+String(o.capture)+String(o.wrap);if(i.cache.hasOwnProperty(s))return i.cache[s].result;let c=Math.min(e,t),f=Math.max(e,t);if(1===Math.abs(c-f)){let n=e+"|"+t;return o.capture?`(${n})`:!1===o.wrap?n:`(?:${n})`}let l=h(e)||h(t),d={min:e,max:t,a:c,b:f},p=[],g=[];if(l&&(d.isPadded=l,d.maxLen=String(d.max).length),c<0){g=u(f<0?Math.abs(f):1,Math.abs(c),d,o),c=d.a=0}return f>=0&&(p=u(c,f,d,o)),d.negatives=g,d.positives=p,d.result=function(e,t,n){let r=a(e,t,"-",!1,n)||[],i=a(t,e,"",!1,n)||[],o=a(e,t,"-?",!0,n)||[];return r.concat(o).concat(i).join("|")}(g,p,o),!0===o.capture?d.result=`(${d.result})`:!1!==o.wrap&&p.length+g.length>1&&(d.result=`(?:${d.result})`),i.cache[s]=d,d.result};function o(e,t,n){if(e===t)return{pattern:e,count:[],digits:0};let r=function(e,t){let n=[];for(let r=0;r<e.length;r++)n.push([e[r],t[r]]);return n}(e,t),i=r.length,o="",u=0;for(let e=0;e<i;e++){let[t,i]=r[e];t===i?o+=t:"0"!==t||"9"!==i?o+=p(t,i,n):u++}return u&&(o+=!0===n.shorthand?"\\\\d":"[0-9]"),{pattern:o,count:[u],digits:i}}function u(e,t,n,r){let i,u=function(e,t){let n=1,r=1,i=f(e,n),o=new Set([t]);for(;e<=i&&i<=t;)o.add(i),i=f(e,n+=1);for(i=l(t+1,r)-1;e<i&&i<=t;)o.add(i),i=l(t+1,r+=1)-1;return(o=[...o]).sort(s),o}(e,t),a=[],c=e;for(let e=0;e<u.length;e++){let t=u[e],s=o(String(c),String(t),r),f="";n.isPadded||!i||i.pattern!==s.pattern?(n.isPadded&&(f=g(t,n,r)),s.string=f+s.pattern+d(s.count),a.push(s),c=t+1,i=s):(i.count.length>1&&i.count.pop(),i.count.push(s.count[0]),i.string=i.pattern+d(i.count),c=t+1)}return a}function a(e,t,n,r,i){let o=[];for(let i of e){let{string:e}=i;r||c(t,"string",e)||o.push(n+e),r&&c(t,"string",e)&&o.push(n+e)}return o}function s(e,t){return e>t?1:t>e?-1:0}function c(e,t,n){return e.some(e=>e[t]===n)}function f(e,t){return Number(String(e).slice(0,-t)+"9".repeat(t))}function l(e,t){return e-e%Math.pow(10,t)}function d(e){let[t=0,n=""]=e;return n||t>1?`{${t+(n?","+n:"")}}`:""}function p(e,t,n){return`[${e}${t-e==1?"":"-"}${t}]`}function h(e){return/^-?(0+)\\d/.test(e)}function g(e,t,n){if(!t.isPadded)return e;let r=Math.abs(t.maxLen-String(e).length),i=!1!==n.relaxZeros;switch(r){case 0:return"";case 1:return i?"0?":"0";case 2:return i?"0{0,2}":"00";default:return i?`0{0,${r}}`:`0{${r}}`}}i.cache={},i.clearCache=(()=>i.cache={}),t.exports=i},{"is-number":2}],2:[function(e,t,n){"use strict";t.exports=function(e){return"number"==typeof e?e-e==0:"string"==typeof e&&""!==e.trim()&&(Number.isFinite?Number.isFinite(+e):isFinite(+e))}},{}]},{},[1])(1)});\n\n\n$( document ).ready( function() {\n $( "#rangeLeft, #rangeRight" ).keydown( function() {\n clearDisplay();\n } );\n $(\'#wholestring\').click(function() {\n $(\'#wholestring\').attr(\'checked\', \'checked\');\n $(\'#wb\').attr(\'checked\', false);\n $(\'#dgtb\').attr(\'checked\', false);\n $(\'#whtb\').attr(\'checked\', false);\n })\n $(\'#wb\').click(function() {\n $(\'#wb\').attr(\'checked\', \'checked\');\n $(\'#wholestring\').attr(\'checked\', false);\n $(\'#dgtb\').attr(\'checked\', false);\n $(\'#whtb\').attr(\'checked\', false);\n })\n $(\'#dgtb\').click(function() {\n $(\'#dgtb\').attr(\'checked\', \'checked\');\n $(\'#wb\').attr(\'checked\', false);\n $(\'#wholestring\').attr(\'checked\', false);\n $(\'#whtb\').attr(\'checked\', false);\n })\n $(\'#whtb\').click(function() {\n $(\'#whtb\').attr(\'checked\', \'checked\');\n $(\'#wb\').attr(\'checked\', false);\n $(\'#dgtb\').attr(\'checked\', false);\n $(\'#wholestring\').attr(\'checked\', false);\n })\n $( "#run" ).click( function() {\n clearDisplay();\n var rangeLeft = $( "#rangeLeft" ).val();\n var rangeRight = $( "#rangeRight" ).val();\n if ( ! checkRanges( rangeLeft, rangeRight ) ) return;\n let source = toRegexRange(rangeLeft, rangeRight);\n \n if ($(\'#frac\').is(\':checked\')) {\n source = source + \'(?:\\\\.\\\\d+)?\';\n }\n if ($(\'#allowzero\').is(\':checked\')) {\n source = "0*" + source;\n }\n if ($(\'#neg\').is(\':checked\')) {\n source = "-?" + source;\n }\n if ( $(\'#wholestring\').is(\':checked\')) {\n source = \'^\' + source + \'$\';\n } else if ( $(\'#wb\').is(\':checked\')) {\n source = \'\\\\b\' + source + \'\\\\b\';\n } else if ( $(\'#whtb\').is(\':checked\')) {\n source = \'(?<!\\\\S)\' + source + \'(?!\\\\S)\';\n } else if ( $(\'#dgtb\').is(\':checked\')) {\n source = \'(?<!\\\\d)\' + source + \'(?!\\\\d)\';\n }\n $( "#result" ).append( "<B>" + source.replace(/&/g,\'&\').replace(/</g,\'<\').replace(/>/g,\'>\') + "</B><BR/>" );\n } );\n} );\n\nfunction checkRanges( rangeLeft, rangeRight ) {\n if ( /\\D/.test( rangeLeft ) || /\\D/.test( rangeRight ) ) {\n $( "#result" ).append( "Type two numbers<BR/>" );\n return false;\n }\n rangeLeft = parseInt( rangeLeft );\n rangeRight = parseInt( rangeRight );\n if ( isNaN( rangeLeft ) || isNaN( rangeRight ) ) $( "#result" ).append( "Range boundaries are not specified<BR/>" );\n if ( rangeLeft < 0 ) $( "#result" ).append( "Left boundary is less than 0<BR/>" );\n if ( rangeRight < 0 ) $( "#result" ).append( "Right boundary is less than 0<BR/>" );\n if ( rangeLeft > rangeRight ) $( "#result" ).append( "Left boundary is greater than the right boundary<BR/>" );\n return( !(\n rangeLeft < 0 ||\n rangeRight < 0 ||\n rangeLeft > rangeRight ||\n isNaN( rangeLeft ) ||\n isNaN( rangeRight )\n ) );\n}\n\nfunction clearDisplay() {\n $( "#result" ).html( "" );\n $( "#test" ).hide();\n}Run Code Online (Sandbox Code Playgroud)\r\n<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>\n <p>Type in minimum and maximum values and click <i>Generate</i>.</p>\n <INPUT id="rangeLeft" value=1 /> - <INPUT id="rangeRight" value=365 />\n <BR/>\n <BUTTON id="run">Generate</BUTTON>\n <pre><code id="result" /></pre>\n <div>\n <label><input type="checkbox" id="wholestring"/>Match whole string</label> <br/>\n <label><input type="checkbox" id="wb"/>Match within word boundaries</label><br/>\n <label><input type="checkbox" id="dgtb"/>Match when not enclosed with digits</label><br/>\n <label><input type="checkbox" id="whtb"/>Match when enclosed with whitespaces or start/end of string</label><br/>\n <label><input type="checkbox" id="allowzero"/>Allow leading zeros</label><br/>\n <label><input type="checkbox" id="neg"/>Optionally match negative numbers</label><br/>\n <label><input type="checkbox" id="frac"/>Optionally match fractional digits (floats)</label><br/>\n </div>Run Code Online (Sandbox Code Playgroud)\r\n这里的大部分 JavaScript 代码都是借自\xd0\x90\xd0\xbb\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd1\x82\xd0\xbc \xd0\xb4\xd0\xbb\ xd1\x8f\xd0\xbf\xd1\x80\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd0\ xbd\xd0\xb8\xd1\x8f\xd0\xb4\xd0\xb8\xd0\xb0\xd0\xbf\xd0\xb0\xd0\xb7\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbd\ xd0\xbe\xd0\xbc\xd0\xb5\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb2\xd1\x80\xd0\xb5\xd0\xb3\xd1\x83\xd0\xbb\xd1\ x8f\xd1\x80\xd0\xbd\xd0\xbe\xd0\xb5\xd0\xb2\xd1\x8b\xd1\x80\xd0\xb0\xd0\xb6\xd0\xb5\xd0\xbd\xd0\xb8\ xd0\xb5和to-regex-range npm 库。
\n您可以将以下范围的正则表达式放在一起:
1[1-9]\d = 110-199
[2-9]\d\d = 200-999
1\d\d\d = 1000-1999
2[0-1]\d\d= 2000-2199
22[0-2]\d = 2200-2229
223[0-4] = 2230-2234
Run Code Online (Sandbox Code Playgroud)
来形成:
(1[1-9]\d|[2-9]\d\d|1\d\d\d|2[0-1]\d\d|22[0-2]\d|223[0-4])
Run Code Online (Sandbox Code Playgroud)
\d 表示 [0-9],但少三个字符
虽然你可以用一些看起来很荒谬的正则表达式来做到这一点(正如 VonC 回答的那样),正则表达式真的不应该这样做..为什么不将数字检查推迟到重定向到脚本?
如果号码110-2234转到SCRIPT1,以及1-109转到SCRIPT2,这将是很多简单以指导所有数字router脚本,并将其重定向到正确的位置(通过HTTP重定向)..
在.htaccess:
RewriteRule ^view/([0-9]+)/?$ router.php?page=$1 [L]
Run Code Online (Sandbox Code Playgroud)
..then in router.php,类似于:
<?PHP
if(
int($_GET['page']) > 110 &&
int($_GET['page']) < 2234
){
header("Status: 301 Moved Permanently\nLocation: /script1");
}else{
header("Status: 404 Not Found");
}
?>
Run Code Online (Sandbox Code Playgroud)