Chinaunix
标题:
正则求助 - 前面如何对齐
[打印本页]
作者:
sunzhiguolu
时间:
2016-11-07 10:24
标题:
正则求助 - 前面如何对齐
本帖最后由 sunzhiguolu 于 2016-11-07 10:59 编辑
示例文本如下:
aaaaabbbbbcccccddd
aaaaabbbbbccccc
希望得到的结果如下:
aaaaa|bbbbb|ccccc|ddd
aaaaa|bbbbb|ccccc
匹配要求:
我希望每5个字符之间插入一个 "|", 如果该行的字符数量正好是 5 的倍数 行末就不插入 "|" 了.
我的代码如下:
#!/bin/perl
use strict;
use warnings;
while (<DATA>){
s/(\w{5})\B/$1|/g;
print;
}
__DATA__
aaaaabbbbbcccccddd
aaaaabbbbbccccc
复制代码
如果利用环视的功能, 能否完成插入操作. 还请大家指点, 谢谢大家...
内容补充:
进行插入时, 希望采用如下形式的正则完成替换操作:
s/pattern/|/g
复制代码
作者:
jason680
时间:
2016-11-07 10:45
环视 ?
s/(\w{5})(?=.)/$1|/g
s/(.{5})(?=.)/$1|/g
作者:
sunzhiguolu
时间:
2016-11-07 10:56
回复
2#
jason680
s/(\w{5})
(?=.)
/$1|/g
s/(.{5})
(?=.)
/$1|/g
大神, 我说的不是您在代码中 的那个意思. 我在发帖子的时候 还是没有将情况说明白.
我希望 每行的文本每五个字符插入一个 "|", 因为不需要对那五个字符进行操作 所以在使用 s///g 操作符时, 不希望在替换位置利用捕获变量 $1| 的形式进行替换操作.
s/pattern/|/g
复制代码
能否利用上述的形式完成插入操作, 还请您指点.
作者:
jason680
时间:
2016-11-07 11:01
回复
3#
sunzhiguolu
\K
or
$ perldoc perlre
作者:
sunzhiguolu
时间:
2016-11-07 11:10
回复
4#
jason680
大神, 您说的 \K 的确可以满足
结果
要求, 若是利用环视如何表示一行的开始 字符的数量正好是 5 的倍数, 余下不满足字符数量为 5 的字符就不进行 "|" 字符的插入操作.
perldoc perlre
您提供的帮助的圈子太大了. 请您给个具体点的示例 正则的环视功能 左看看 右看看 感觉真的好神奇. 就是不会灵活运用, 还请您再次指点, 谢谢...
作者:
sunzhiguolu
时间:
2016-11-07 11:22
另外, 完成此次操作是否必须依赖逆序环视? (通过顺序环视能否完成逆序环视进行判断的条件, 弥补逆序环视的短板)
还请大家指点, 谢谢大家...
作者:
sunzhiguolu
时间:
2016-11-07 11:37
自己顶顶, 等大神出手帮忙.
作者:
yinyuemi
时间:
2016-11-07 14:36
回复
7#
sunzhiguolu
echo 'aaaaabbbbbcccccddd
aaaaabbbbbccccc' |perl -pe 's/([^|]{5})\K(?=(.{1,5}))/|/g'
aaaaa|bbbbb|ccccc|ddd
aaaaa|bbbbb|ccccc
复制代码
作者:
sunzhiguolu
时间:
2016-11-07 17:17
回复
8#
yinyuemi
谢谢大神指点, 只是您这个思路 Jason680 大神在 4 楼已经给过提示了. 有其他的解决思路吗?
作者:
sunzhiguolu
时间:
2016-11-07 17:37
如果依赖语言本身的功能, 倒是可以完成插入操作.
#!/bin/perl
use strict;
use warnings;
while (<DATA>){
$_ = reverse;
s/(?<=\w)(?=(?:\w{5})+\Z)/|/g;
$_ = reverse;
print;
}
__DATA__
aaaaabbbbbcccccddd
aaaaabbbbbccccc
复制代码
作者:
zhlong8
时间:
2016-11-07 20:56
直接一个一个字符数也行啊,不需要正则表达式这高级功能
作者:
sunzhiguolu
时间:
2016-11-07 22:59
回复
11#
zhlong8
我猜大神 也没啥办法吧.
作者:
zhlong8
时间:
2016-11-08 11:00
回复
12#
sunzhiguolu
正则表达式有正则表达式的限制,我能力有限没法给你证明必须要用环视啊。但是这么简单的功能除了 Perler 其他所有人估计都会考虑直接按字符处理吧
作者:
sunzhiguolu
时间:
2016-11-08 11:25
回复
13#
zhlong8
perl 在这一点上应该学习下 .NET 正则类库. (逆序环视支持完整的表达式)
作者:
sditmaner
时间:
2016-11-08 12:46
回复 8# yinyuemi
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2