我想在RegExp中匹配X和Y之间的数字.这可能吗?
([0-9] +)将匹配任何数字,我怎么能匹配一个数字,例如,110和2234?
根据生成正则表达式以匹配任意数值范围,并在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
会做的伎俩.
该过程将(仍然遵循该Regex生成器):
首先,分成相等的长度范围:
110 - 999 1000 - 2234
其次,闯入产生简单正则表达式的范围:
110 - 199 200 - 999 1000 - 1999 2000 - 2199 2200 - 2229 2230 - 2234
将每个范围转换为正则表达式:
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]
折叠相邻的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])
接下来我们将尝试使用树来分解公共前缀:
根据正则表达式前缀解析为树:
. 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]
将解析树转换为正则表达式产生:
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])))
我们选择较短的一个作为结果.
\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
这不是正则表达式所擅长的.您可能会发现更容易确保您拥有正确的位数/^([0-9]{3,4})$/
,然后对捕获进行进一步检查.