Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 创建尽可能短的正则表达式_Regex - Fatal编程技术网

Regex 创建尽可能短的正则表达式

Regex 创建尽可能短的正则表达式,regex,Regex,我想创建一个与这些值匹配的正则表达式 7-5 6-6((0-99)-(0-99)) 6-4 6-3 6-2 6-1 6比0 0-6 1-6 2-6 3-6 4-6 6-6示例是一种特殊情况,以下是一些值示例: 6-6(23-8) 6-6(4-25) 6-6(56-34) 有没有可能制作一个可以做到这一点的正则表达式 如果是这样,是否可以进一步扩展6-6特例的正则表达式,使括号内两个数字之间的差值等于2或-2 我可以很容易地用过程代码来编写它,但我真的很好奇是否有人能为此设计一个正则表达式 最后,

我想创建一个与这些值匹配的正则表达式

7-5

6-6((0-99)-(0-99))

6-4

6-3

6-2

6-1

6比0

0-6

1-6

2-6

3-6

4-6

6-6示例是一种特殊情况,以下是一些值示例:

6-6(23-8)

6-6(4-25)

6-6(56-34)

有没有可能制作一个可以做到这一点的正则表达式

如果是这样,是否可以进一步扩展6-6特例的正则表达式,使括号内两个数字之间的差值等于2或-2

我可以很容易地用过程代码来编写它,但我真的很好奇是否有人能为此设计一个正则表达式

最后,如果可以进一步扩展,使每个数字都在自己的比赛组中,我会感到惊讶。例如,对于7-5,我可以有一个匹配组的值为7,另一个匹配组的值为5。但是对于6-6(24-26),我想要一个前六名的比赛组,第二个6名的比赛组,24名的比赛组和26名的比赛组

这可能是不可能的,但你们中的一些人可能会得到这一部分

祝你好运,谢谢你的帮助。

我马上想到(可能有一些错误,但原则应该是好的):

\d-\d | 6-6(\d+-\d+)

与任何regexp一样,您可以将要提取的内容用括号括起来作为匹配组:

(\d)-(\d)|(6)-(6)(\d)+-(\d+)


在6-6的情况下,前两个括号应为6,后两个括号应为后面的多位数值。

这里有一个括号,它将只匹配您想要的数字,并允许您按名称获取每个数字:

p = r'(?P<a>[0-4]|6|7)-(?P<b>[0-4]|6|5) *(\((?P<c>\d{1,2})-(?P<d>\d{1,2})\))?'
它将返回一个四元素元组,其中包含您要查找的值(如果未找到匹配项,则返回
None


这种模式的一个问题是,无论是否与“6-6”匹配,它都会修补括号中的内容。仅当6-6匹配时,此括号才与最后一个括号匹配:

p = r'(?P<a>[0-4]|(?P<tmp_a>6)|7)-(?P<b>(?(tmp_a)(?P<tmp_b>6)|([0-4]|5)))(?(tmp_b) *(\((?P<c>\d{1,2})-(?P<d>\d{1,2})\))?)'
p=r'(?p[0-4]|(?P6)| 7)-(?p(?(tmp|a)(?P6)|([0-4]| 5))(?(tmp|b)*(\(?p\d{1,2})-(?p\d{1,2})?)

我不知道如何找出括号中数字之间的差异;正则表达式只知道字符串,不知道数值




(我在这里假设python语法;perl语法略有不同,尽管perl支持python的工作方式。)

您可以这样做:

7-5|6-[0-4]|[0-5]-6|6-6 \(\d\d?-\d\d?\)

只需添加paren即可获得您的比赛分组。

不。答案是“我们不能”,原因是您试图用锤子挖洞

写一个很长的“聪明”(这个词会引起很多人的下意识反应,他们比我更反对regex)regex的问题是,六个月后,你会忘记那些你用得太多的聪明的regex特性,你会写六个月的与其他东西相关的代码,你会回到你令人印象深刻的正则表达式,必须调整一个细节,然后你会说,“WTF?”

这是(我理解)您想要的Perl语言:

# data is in $_
if(/7-5|6-[0-4]|[0-4]-6|6-6 \((\d{1,2})-(\d{1,2})\)/) {
  if($1 and $2 and abs($1 - $2) == 2) {
    # we have the right difference
  }
}

有人可能会说给定的正则表达式有点多,但我不认为这太糟糕。如果
\d{1,2}
位太模糊,您可以使用
\d\d?
(这是我最初使用的,但不喜欢重复)。

唯一的问题是表达式中的前两组(\d)-(\d)必须限制为上述值,它们不能是任何数字。谢谢你的意见。我意识到,我要求你用一种模式解决多个模式。我知道多个模式可以做到这一点,但我希望有聪明的人能够将其整合到一个模式中。请注意,编写过程代码将更加清晰,并且可能更加高效。这太有趣了。我同意你的看法,我不认为我真的会在代码中使用它,但我还是很好奇。我也反对晦涩的正则表达式,因为我永远记不起它们做了什么。谢谢你的意见。@马克-很高兴知道你没有打算使用它。没关系,我们仍然感谢你的努力。干得好,伙计。
# data is in $_
if(/7-5|6-[0-4]|[0-4]-6|6-6 \((\d{1,2})-(\d{1,2})\)/) {
  if($1 and $2 and abs($1 - $2) == 2) {
    # we have the right difference
  }
}