请帮助我编写正则表达式来解析以下字符串
{0}:{1}:{2}
其中,{0}
是GUID,{1}
和{2}
是范围从1到65536的数字
示例:
123e4567-e89b-12d3-a456-9AC7CBDCEE52:21:4552
7e21dc49-8640-4982-b3eb-51608b680e3c:1:65536
982e1b18-ac35-4eba-84fc-53bc1c993dcf:6441:4
注意:GUID应该没有大括号(只有36个符号长度)。
这就是我尝试过的
(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}(:\d+:\d+|$)$
但它允许任何数字。你能帮忙吗?有较短的路去吗
没有指定语言,但您也可以对2个捕获组使用更广泛的匹配,其中数字的每个匹配从1开始,并使用代码检查组中的值是否小于或等于65536。
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}:([1-9][0-9]*):([1-9][0-9]*)$
解释
^
字符串的开始[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}
匹配guid格式:([1-9][0-9]*)
匹配:
并捕获组1以匹配从1开始的数字:([1-9][0-9]*)
匹配:
并捕获组2以匹配从1开始的数字$
字符串结束例如,使用C#(它列为您的顶部标记)
string pattern = @"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}:([1-9][0-9]*):([1-9][0-9]*)$";
string s = @"123e4567-e89b-12d3-a456-9AC7CBDCEE52:21:4552";
int n1;
int n2;
Match m = Regex.Match(s, pattern);
if (m.Success && Int32.TryParse(m.Groups[1].Value, out n1) && Int32.TryParse(m.Groups[1].Value, out n2)) {
if (n1 <= 65536 && n2 <= 65536) {
Console.WriteLine("Match");
}
}
输出
Match
正则表达式是验证数字位于范围内的繁琐方法,但这是可能的。如果可能的话,我建议用其他方法验证数值。如果必须使用正则表达式,下面是验证数值范围的基本概念:
由于正则表达式处理的是文本而不是数字,因此匹配给定范围内的数字需要格外小心。不能只写[0-255]来匹配0到255之间的数字。虽然是一个有效的正则表达式,但它与完全不同的东西相匹配。[0-255]是一个包含三个元素的字符类:字符范围0-2、字符5和字符5(同样)。此字符类与单个数字0、1、2或5匹配,就像[0125]一样。
匹配三位数稍微复杂一些,因为我们需要排除256到999之间的数字。1[0-9][0-9]负责100到199个。2[0-4][0-9]匹配200到249。最后,25[0-5]加上250到255。
使用交替法将所有这些放在一起,我们得到:[0-9]|[1-9][0-9]| 1[0-9][0-9]| 2[0-4][0-9]| 25[0-5]。这与我们想要的数字匹配,但有一点需要注意:正则表达式搜索通常允许部分匹配,因此我们的正则表达式将匹配12345中的123。有两种解决方案。
(全文载於https://www.regular-expressions.info/numericranges.html)
我很懒,所以我不用手工构建一个巨大的正则表达式来匹配1-65536http://gamon.webfactional.com/regexnumericrangegenerator/.结果是:
([1-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-6])
从上面将其插入您的正则表达式中,我们可以得到以下结果(在chrome devtools控制台中运行):
new RegExp(
"^"
+ "[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}"
+ ":"
+ "([1-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-6])"
+ ":"
+ "([1-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-6])"
+ "$"
).test("7e21dc49-8640-4982-b3eb-51608b680e3c:1:65536")
>> true
完全正则表达式:
^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}:([1-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-6]):([1-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-6])$
问题内容: 我正在使用正则表达式来验证字符串中的特定格式。该字符串将成为游戏规则。 示例:根据规则,“ DX 3”也可以,但是“ DX 14”也可以。。。我知道如何查看字符串并找到一个或多个“数字”,因此问题在于正则表达式将也匹配34,这个数字超出了规则的“范围” … 我是否缺少有关正则表达式的功能?还是根本不可能? 问题答案: 不幸的是,没有简单的方法可以在正则表达式中定义范围。如果要使用范围1
我试图验证用户输入坐标的格式是:x,y,所以我使用正则表达式。x和y可以在1到15之间,所以我用了 更重要的是,使用Java的正则表达式特性是好的实践吗?我可以想出其他方法来做到这一点,但这只是为了一个我正在工作的个人项目,并尝试不同的方法来处理我通常做得很乱的事情。
本文向大家介绍JavaScript查找范围内所有数字的总和,包括了JavaScript查找范围内所有数字的总和的使用技巧和注意事项,需要的朋友参考一下 问题 我们需要编写一个JavaScript函数,该函数接受一个指定范围的数组。 我们的函数应该找到并返回落在该范围内的所有自然数之和,包括范围数。 示例 以下是代码- 输出结果 以下是控制台输出-
问题内容: 我想查找没有重复数字的10位数字,例如: 目前,我正在使用正则表达式,但只能匹配10位数字(它不检查重复项。我正在使用此正则表达式: 可以使用正则表达式完成此操作,还是有更好的方法来实现此目的? 问题答案: 此正则表达式有效: 这使用锚定的否定前瞻和后向引用来断言没有重复的字符。 观看带有示例的现场演示。 在Java中:
问题内容: 我想用以下代码查找字符串中的所有数字: 我还尝试将定界符添加到正则表达式,使用正数作为的第二个参数,使用仅数字字符串,例如“ 123”作为第一个参数… 但是输出总是 我似乎想念一下正则表达式在Go中的工作原理,但是无法绕开它。这不是有效的表达方式吗? 问题答案: 问题出在你的第二个整数参数上。引用以下软件包的文档: 这些例程使用一个额外的整数参数n;如果n> = 0,则该函数最多返回n
是否可以按任意顺序定义嵌套的正则表达式? 以下程序按预期工作: 如果交换前两行,编译器将产生错误。 有没有办法覆盖这个限制(不使用)?