"string x/0/y" 的正则表达式

3

大家好,

我正在尝试解决一个正则表达式的问题:

我想要得到这样的结果:

"string x/0/y",其中x在1-6之间,y在1-48之间。

我尝试了以下内容:

interface GigabitEthernet [1-6]/0/([1-4]*[1-8])

但如果 y = 50,则它仍考虑 5 并删除 "0"

我尝试了这个

interface GigabitEthernet [1-6]/0/([1-4][1-8])

但是如果 y = 1-9,它就不符合表达式。

我会感激任何帮助。

谢谢!


最后一个表格在y=10和y=19时也失败了。 - MSalters
7个回答

4

尝试使用([1-9]|[1-3][0-9]|4[0-8])作为正则表达式的第二部分。

请记住,如果您需要执行大量类似的搜索,则仅使用正则表达式可能不是最佳工具。相反,您的程序可以搜索/(\d+)/0/(\d+)/的一般模式,提取匹配组,然后验证数字范围。


你需要在末尾添加 $,因为 50 仍然匹配 [1-9] 这个选项。 - Adam Rosenfield
或者在行末添加一些内容,如果不是行末。 - Jacob
使用.NET或Java正则表达式引擎,例如1/0/491/0/100的情况会在您的正则表达式中产生误报。此外,1/0/39只部分匹配而不是完全匹配。您可能需要在正则表达式末尾添加一个锚定标记来修复这个问题,例如$(?!\d) - Mike Clark

4

我不建议在正则表达式中尝试进行数字范围检查。它很难编写,甚至更难阅读。相反,使用像这样的正则表达式:

(\d)/0/(\d{1,2})

然后,使用捕获组来检查第一个是否为:
x >= 1 and x <= 6

第二个是

y >= 1 and y <= 48

当您需要回来查看时,这将更容易阅读。


在Python中的一个具体例子可能是:

s = "5/0/14"
m = re.match(r"(\d)/0/(\d{1,2})", s)
if m is not None:
    x = int(m.group(1))
    y = int(m.group(2))
    if x >= 1 and x <= 6 and y >= 1 and y >= 48 then
        print("Looks good!")

同意!人们经常想要使用纯正则表达式来解决复杂问题的100%。然而,最明智、高效、可维护和易读的方法通常是使用简单的正则表达式,并在代码中表达复杂性和边界。 - Mike Clark

1

试试这个:

interface GigabitEthernet [1-6]/0/([1-9]|[1-3][0-9]|4[0-8])

使用.NET或Java正则表达式引擎,例如1/0/491/0/100的情况会在您的正则表达式中产生误报。此外,1/0/39只能部分匹配而不是完全匹配。您可能需要在正则表达式末尾添加一个锚定标记来修复这个问题,例如$(?!\d) - Mike Clark

1

正则表达式在表达任意数字范围时并不十分优雅。但以下两种方式都可以实现:

interface GigabitEthernet [1-6]/0/([1-3][0-9]|4[0-8]|[1-9])$

或者

interface GigabitEthernet [1-6]/0/([1-3][0-9]|4[0-8]|[1-9](?![0-9]))

其中一个或另一个可能更适合您的正则表达式引擎或目标数据,但只有您自己才知道。


1

其他人建议使用([1-9]|[1-3][0-9]|4[0-8])。它可以工作,但不是非常有效,因为除了第一个字符以外的备选项无法区分,即可能需要回溯。

正则表达式([1-3][0-9]?|4[0-8]?|[5-9])匹配相同的字符串。但是,在这里第一个字符唯一地确定了使用哪个备选项,因此不需要回溯。


使用.NET或Java正则表达式引擎,例如1/0/491/0/100的情况在您的正则表达式中产生了错误匹配。此外,1/0/39只部分匹配而不是完全匹配。您可能需要在正则表达式末尾添加一个锚定标记来修复这个问题,如$(?!\d) - Mike Clark
@Mike Clark:我引用了一个更大的正则表达式的一部分,并提供了另一个更有效的正则表达式片段,它可以精确匹配相同的字符串。显然,两者都无法处理完整的1/0/1输入,因为它们甚至无法匹配第一个/。缺少结束锚点实际上是它们的最后一个问题。 - MSalters
好的。抱歉。我会删除我的评论。 - Mike Clark

0
你需要像这样的东西:

[1-6]/0/([1-9] | [1-3][0-9] | 4[0-8])


使用.NET或Java正则表达式引擎,例如1/0/491/0/100的情况会在您的正则表达式中产生误报。此外,1/0/39只部分匹配而不是完全匹配。您可能需要在正则表达式末尾添加一个锚定标记来修复这个问题,例如$(?!\d) - Mike Clark
你能解释一下1/0/49和1/0/100为什么是假阳性吗? - Ben
问题指定最后一个数字应在 [1, 48] 范围内,因此 1/0/49 不应匹配。该答案缺少结尾锚点,因此会匹配 1/0/4 子字符串,忽略最后的 9 - MSalters

0

GigabitEthernet [1-6]/0/((4[0-8])|([1-3]?\d))

这段代码处理了最后一部分的两个选项。一个是匹配39及以下的所有数字,另一个是匹配40-48之间的数字。


1
案例,例如 1/0/491/0/100 在您的正则表达式中存在误报。 您可能希望在正则表达式的末尾添加一个锚定标记以防止这种误报,例如 $(?!\d) - Mike Clark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接