当前位置: 首页 > 知识库问答 >
问题:

用于查找范围内的GUID和数字的正则表达式

储阳曦
2023-03-14

请帮助我编写正则表达式来解析以下字符串

{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个答案

陆啸
2023-03-14

没有指定语言,但您也可以对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
林辰钊
2023-03-14

正则表达式是验证数字位于范围内的繁琐方法,但这是可能的。如果可能的话,我建议用其他方法验证数值。如果必须使用正则表达式,下面是验证数值范围的基本概念:

由于正则表达式处理的是文本而不是数字,因此匹配给定范围内的数字需要格外小心。不能只写[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

  • 是否可以按任意顺序定义嵌套的正则表达式? 以下程序按预期工作: 如果交换前两行,编译器将产生错误。 有没有办法覆盖这个限制(不使用)?