匹配字符串: <sometag>一些任意不定长的文字,但不包括 AT 符号和小于号</sometag>
一步将其替换为: <sometag>一 @些 @任 @意 @不 @定 @长 @的 @文 @字 @,@但 @不 @包 @括 @A@T@符 @号 @和 @小 @于 @号</sometag>
也就是在 tag 内部的任意两个字符之间插入 @ 。
我想了下应该是做不到的,请大家帮确认下。
1 thedog 2018-08-03 12:31:13 +08:00 via Android 当成一个列表,join 一下?不明白为什么要用正则 |
2 jayx 2018-08-03 12:33:43 +08:00 python 零宽断言匹配,然后 join()方法插入 |
![]() | 3 CEBBCAT 2018-08-03 12:49:37 +08:00 正则把 sometag 匹配出来,别的事交给我 C 来做 ![]() |
![]() | 4 dreasky 2018-08-03 13:11:51 +08:00 re.sub(r'(.)', r'@\1', r'一些任意不定长的文字,但不包括 AT 符号和小于号') '@一 @些 @任 @意 @不 @定 @长 @的 @文 @字 @,@但 @不 @包 @括 @ @A@T@ @符 @号 @和 @小 @于 @号' 中文需要 python3,剩下的问题很简单 |
![]() | 5 rabbbit 2018-08-03 13:23:41 +08:00 硬写成一行倒是可以 js text = '<sometag>一些任意不定长的文字,但不包括 AT 符号和小于号</sometag>'; text.replace(/(?<=<sometag>)(.*)(?=<\/sometag>)/, (str) => {return str.split('').filter(function(i) { return i.trim() !== '' ? true: false}).join('@')}); // "<sometag>一 @些 @任 @意 @不 @定 @长 @的 @文 @字 @,@但 @不 @包 @括 @A@T@符 @号 @和 @小 @于 @号</sometag>" |
![]() | &nsp; 6 rabbbit 2018-08-03 13:25:45 +08:00 更正 text.replace(/(?<=<sometag>)(.*)(?=<\/sometag>)/, (str) => {return str.split('').filter((i) => { return i.trim() !== ''}).join('@')}); |
![]() | 7 helloiac OP @dreasky 谢谢。因为待匹配文本是不确定的,且有 tag 包裹这个 context 限定,所以恐怕这个方案不可行。 |
![]() | 8 ragnaroks 2018-08-03 13:42:00 +08:00 ![]() 有个文本处理问题,他想到用正则来解决,现在他有两个问题了 |
![]() | 10 ragnaroks 2018-08-03 13:43:22 +08:00 如果是每个字符后加 at 的话,我的想法是创建个 2 倍字符数的数组,遍历进去.. |
![]() | 12 helloiac OP @rabbbit 谢谢具体方案,用比较高级的语言的话这个方案挺好的,不过我用的是 shell,sed 也不支持零宽断言。 |
![]() | 13 yyfearth 2018-08-03 13:51:45 +08:00 ![]() @helloiac 正则一次找不到 但是两次应该可以做到 先把 tag 里面的内容抓出来 然后替换里面的内容 每个字后面中间加 at (除了第一个字 每个字去买加 或者 除了最后一个 每个后面加) @rabbbit 都用上 箭头了 为啥还要用 return 另外可以不用 filter text.replace(/(?<=<sometag>)(.*)(?=<\/sometag>)/, str => str.split(/\s*/).join('@')) 另外这个用到了最新的 ES RegExg 的功能 "?<=" 其实不用也可以 text.replace(/(<sometag>)(.*)(?=<\/sometag>)/, (a, b, str) => b + str.split(/\s*/).join('@')) |
14 JmmBite 2018-08-03 13:58:19 +08:00 |
15 FanWall 2018-08-03 14:10:15 +08:00 via Android 正则很容易做到,但如果不支持环视就无法一句搞定。 |
![]() | 16 helloiac OP |
![]() | 18 goofool 2018-08-03 18:37:03 +08:00 瞎写 sed """ /<.*>/{h; s/\(<[^\/]*>\).*/\1/p;g;s/<.*>\(.*\)<\/.*>/\1/;s/\(.\)/\1@/g; s/@$//p;g;s/.*\(<\/.*>\)/\1/p;d;}; p """ test.txt |