请参见下面的编辑以获取澄清更新
这里是一个Perl的一行代码,代替了grep
perl -wne'print if /^((.)\g
匹配的长度比较明显是在正则表达式之外进行的;我不认为可以很好地在正则表达式内部进行匹配,而且我认为使用非正则表达式的代码没有任何问题 :)
这不能与单个字符匹配 (ab
),这似乎与问题无关。锚点 (^
和$
) 只能匹配具有两个字符的字符串,这似乎是指定的。
那个 \g{-1}
是一个relative backreference。它匹配最后捕获的同一子模式,这正是我们需要的,而不是简单的反向引用 (\g1
)。
这是必需的,因为 \g1
指的是第一个捕获,即最先开始的括号集 (最左侧),这是整个模式的捕获。(我们可以使用 \g2
但这是不好的做法。)
使用命名引用可能会更好,但也更加复杂。
编辑 根据澄清,首先必须是0
,然后是相同数量的1
,并且计算0
的重复次数(因此为空行),当然还有1
的重复(因此是01
)。这大大简化了问题,只需
perl -wne'print if /^(0*)(1*)$/ and length $1 == length $2' file
"
0
和1
可以转换成变量,如果需要可以作为外部参数提供(所以它可以是任何语法,a
和b
等)。
在问题中的示例输入上,如输入file
0011
000111
00000000001111111111
01
011
1100
110001
输出结果如下:
0011
000111
00000000001111111111
01
(输出结果中的最后一行为空行,即中间的空行之后再没有匹配的行)
"
†也就是说,不使用在正则表达式内运行代码的复杂功能,这会使它变得更加复杂。如果你仍然想尝试,可以查看perlre和perlretut。
或者,也可以使用正则表达式中的递归来完成,具有类似(或稍微较少?)的复杂性。