正则表达任何具有动态大小的字符

时间:2011-02-23 14:24:16

标签: regex lazy-evaluation

我想使用一个正则表达式来执行以下操作(为了简化,我提取了我遇到麻烦的部分): 任何字符为1到5个第一个字符,然后是“下划线”,然后是一些数字,然后是“下划线”,然后是一些数字或点。

对“下划线”的限制应该是这样的:

^([^_]{1,5})_([\\d]{2,3})_([\\d\\.]*)$

但是我想在1-5个第一个字符中允许“_”,以防它仍然匹配正则表达式的结尾,例如,如果我有一些想法:

to_to_123_12.56

我认为这与正则表达式引擎中的一个急切问题有关,然而,我试图做一些懒惰的事情,如解释here但没有成功。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我使用了以下正则表达式,它似乎适用于您的任务。我只是将您的初始[^_]替换为.

^.{1,5}_\d{2,3}_[\d\.]*$

最好将*替换为+,除非在最后的“_”之后不允许任何内容。请注意,您的最后部分允许多个“。” (我不知道这是不是你想要的。)

对于记录,这是我用来验证正则表达式的快速Python脚本:

import re
strs = [ "a_12_1",
         "abc_12_134",
         "abcd_123_1.",
         "abcde_12_1",
         "a_123_123.456.7890.",
         "a_12_1",
         "ab_de_12_1",
       ]
myre = r"^.{1,5}_\d{2,3}_[\d\.]+$"

for str in strs:
    m = re.match(myre, str)
    if m:
        print "Yes:",
        if m.group(0) == str:
            print "ALL",
    else:
        print "No:",
    print str

输出是:

Yes: ALL a_12_1
Yes: ALL abc_12_134
Yes: ALL abcd_134_1.
Yes: ALL abcde_12_1
Yes: ALL a_123_123.456.7890.
Yes: ALL a_12_1
Yes: ALL ab_de_12_1

答案 1 :(得分:1)

^(.{1,5})_(\d{2,3})_([\d.]*)$

适用于您的示例。无论您是否使用惰性量词,结果都不会改变。

答案 2 :(得分:0)

在回答评论(写出懒惰的表情)时,我看到我犯了一个错误...如果我只是使用下面的经典正则表达式,它可以工作:

^(.{1,5})_([\\d]{2,3})_([\\d\\.]*)$

谢谢。