Chinaunix

标题: 正则求助 - 前面如何对齐 [打印本页]

作者: sunzhiguolu    时间: 2016-11-07 10:24
标题: 正则求助 - 前面如何对齐
本帖最后由 sunzhiguolu 于 2016-11-07 10:59 编辑

示例文本如下:
aaaaabbbbbcccccddd
aaaaabbbbbccccc

希望得到的结果如下:
aaaaa|bbbbb|ccccc|ddd
aaaaa|bbbbb|ccccc

匹配要求:
我希望每5个字符之间插入一个 "|", 如果该行的字符数量正好是 5 的倍数 行末就不插入 "|" 了.

我的代码如下:
  1. #!/bin/perl
  2. use strict;
  3. use warnings;

  4. while (<DATA>){
  5.     s/(\w{5})\B/$1|/g;
  6.     print;
  7. }

  8. __DATA__
  9. aaaaabbbbbcccccddd
  10. aaaaabbbbbccccc
复制代码

如果利用环视的功能, 能否完成插入操作. 还请大家指点, 谢谢大家...

内容补充:
进行插入时, 希望采用如下形式的正则完成替换操作:
  1. 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| 的形式进行替换操作.

  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

  1. echo 'aaaaabbbbbcccccddd
  2. aaaaabbbbbccccc' |perl -pe 's/([^|]{5})\K(?=(.{1,5}))/|/g'
  3. aaaaa|bbbbb|ccccc|ddd
  4. aaaaa|bbbbb|ccccc
复制代码


作者: sunzhiguolu    时间: 2016-11-07 17:17
回复 8# yinyuemi
谢谢大神指点, 只是您这个思路 Jason680 大神在 4 楼已经给过提示了. 有其他的解决思路吗?


作者: sunzhiguolu    时间: 2016-11-07 17:37
如果依赖语言本身的功能, 倒是可以完成插入操作.
  1. #!/bin/perl
  2. use strict;
  3. use warnings;

  4. while (<DATA>){
  5.     $_ = reverse;
  6.     s/(?<=\w)(?=(?:\w{5})+\Z)/|/g;
  7.     $_ = reverse;
  8.     print;
  9. }

  10. __DATA__
  11. aaaaabbbbbcccccddd
  12. 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