我想使用一个正则表达式来执行以下操作(为了简化,我提取了我遇到麻烦的部分): 任何字符为1到5个第一个字符,然后是“下划线”,然后是一些数字,然后是“下划线”,然后是一些数字或点。
对“下划线”的限制应该是这样的:
^([^_]{1,5})_([\\d]{2,3})_([\\d\\.]*)$
但是我想在1-5个第一个字符中允许“_”,以防它仍然匹配正则表达式的结尾,例如,如果我有一些想法:
to_to_123_12.56
我认为这与正则表达式引擎中的一个急切问题有关,然而,我试图做一些懒惰的事情,如解释here但没有成功。
有什么想法吗?
答案 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\\.]*)$
谢谢。