匹配字符串: <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>" |
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 1
有个文本处理问题,他想到用正则来解决,现在他有两个问题了
|
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 1
@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 |