查看: 1003|回复: 15
打印 上一主题 下一主题

[求助] 请教一个正则表达式

[复制链接]

该用户从未签到

14

主题

112

回帖

1032

积分

解元

Rank: 5Rank: 5

积分
1032
跳转到指定楼层
1
发表于 2013-4-10 09:34:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
21世纪电脑英汉汉英双向辞典中,每个词条下的正文中,都是用~来代替本词条。
如果想将这里面所有的~替换回该词条,在ultraedit中如何应用正则表达式啊?谢谢!
例如:
</>
book
1 (C)<br>
a. 书,书籍; 著作<br>
read [write] a ~<br>
读 [著] 书<br>
→ closed book,open book.<br>
b. 知识 [教训] 的泉源, (…之) 书<br>
the ~ of Nature <br>
自然之书<br>
</>
bag
1 (C)<br>
a. 袋<br>
a paper ~ <br>
纸袋<br>
→ carry bag,doggie bag,tote bag.<br>
b. 猎物袋<br>
2 (C)<br>
a. 提袋; 旅行袋,提包<br>
a traveling ~ <br>
旅行袋<br>
</>

P.S.我还想将例句的英文和中文摆在同一行,不过可能难度很高?
例如:
a paper ~ <br>
纸袋<br>
改为
a paper bag 纸袋<br>

该用户从未签到

2

主题

52

回帖

2505

积分

解元

Rank: 5Rank: 5

积分
2505
2
发表于 2013-4-10 09:56:57 | 只看该作者
这个有价值,支持一下

该用户从未签到

47

主题

360

回帖

831

积分

举人

Rank: 4

积分
831
3
发表于 2013-4-10 12:26:07 | 只看该作者
有点儿麻烦

该用户从未签到

25

主题

36

回帖

441

积分

禁止发言

积分
441
4
发表于 2013-4-11 10:17:56 | 只看该作者
本帖最后由 zhouxl2000 于 2013-4-15 16:13 编辑

可以提供一个方法,在emeditor中测试可以:
①所有\n替换成""(无);
②</>替换成\n<\>\n;
③^(.*?)( \(.*?)~(.*)$替换成\1\2\1\3,可以多替换几次;
③<br>替换成<br>\n.

该用户从未签到

14

主题

112

回帖

1032

积分

解元

Rank: 5Rank: 5

积分
1032
5
 楼主| 发表于 2013-4-11 16:06:23 | 只看该作者
好的,我找emeditor试一下,先谢谢了!

该用户从未签到

13

主题

454

回帖

3027

积分

贡士

Rank: 6Rank: 6

积分
3027

灌水大神章

6
发表于 2013-4-11 20:51:53 | 只看该作者
本帖最后由 惟吾无为 于 2013-4-13 11:41 编辑

文本处理,当然awk!
windows请安装cygwin或msys。确保可以使用gawk。
linux下面可以直接把代码粘贴到终端执行。
-----
我把你提供的内容保存到了文件o,使用awk完成了所述功能。
  1. gawk 'BEGIN{
  2. # 记录分隔符。记录可以理解为一大段要处理的内容,这个就是段落分隔符了。
  3. RS="\r\n</>\r\n"
  4. # 字段分割符。把字段理解为一个句子。此时正好也是换行符。
  5. FS="\r\n"
  6. }{
  7. # 你要把~替换成词条名字。因为文本分割后,标题是第一个字段。
  8. gsub("~",$1)
  9. # \n([a-zA-Z][ -~]*)<[bB][Rr]>\r\n 匹配以字母开头的,以<br>结束的,没有中文的行。
  10. # ([^\r\n]+)就是后面跟着的一行了,不限中英文。
  11. # \\1 \\2就是前面两个()里的东西了。 "g"表示全部替换。
  12. $0=gensub("\n([a-zA-Z][ -~]*)<[bB][Rr]>\r\n([^\r\n]+)","\n\\1 \\2","g")
  13. # 把结果输出出来。如果想把结果写入文件new.txt,把下面一行的#号去掉。
  14. # printf("%s%s",$0,RS) > "new.txt"
  15. printf("%s%s",$0,RS)
  16. }' o
复制代码

该用户从未签到

13

主题

454

回帖

3027

积分

贡士

Rank: 6Rank: 6

积分
3027

灌水大神章

7
发表于 2013-4-11 20:56:44 | 只看该作者
本帖最后由 惟吾无为 于 2013-4-13 11:41 编辑

效果
  1. froms@froms-HP-g4:/dev/shm$ cat o  # 你的原始文本

  2. </>
  3. book
  4. 1 (C)<br>
  5. a. 书,书籍; 著作<br>
  6. read [write] a ~<br>
  7. 读 [著] 书<br>
  8. → closed book,open book.<br>
  9. b. 知识 [教训] 的泉源, (…之) 书<br>
  10. the ~ of Nature <br>
  11. 自然之书<br>
  12. </>
  13. bag
  14. 1 (C)<br>
  15. a. 袋<br>
  16. a paper ~ <br>
  17. 纸袋<br>
  18. → carry bag,doggie bag,tote bag.<br>
  19. b. 猎物袋<br>
  20. 2 (C)<br>
  21. a. 提袋; 旅行袋,提包<br>
  22. a traveling ~ <br>
  23. 旅行袋<br>
  24. </>
  25. froms@froms-HP-g4:/dev/shm$ gawk 'BEGIN{
  26. > # 记录分隔符。记录可以理解为一大段要处理的内容,这个就是段落分隔符了。
  27. > RS="\r\n</>\r\n"
  28. > # 字段分割符。把字段理解为一个句子。此时正好也是换行符。
  29. > FS="\r\n"
  30. > }{
  31. > # 你要把~替换成词条名字。因为文本分割后,标题是第一个字段。
  32. > gsub("~",$1)
  33. > # \n([a-zA-Z][ -~]*)<[bB][Rr]>\r\n 匹配以字母开头的,以<br>结束的,没有中文的 行。
  34. > # ([^\r\n]+)就是后面跟着的一行了,不限中英文。
  35. > # \\1 \\2就是前面两个()里的东西了。 "g"表示全部替换。
  36. > $0=gensub("\n([a-zA-Z][ -~]*)<[bB][Rr]>\r\n([^\r\n]+)","\n\\1 \\2","g")
  37. > # 把结果输出出来。如果想把结果写入文件new.txt,把下面一行的#号去掉。
  38. > # printf("%s%s",$0,RS) > "new.txt"
  39. > printf("%s%s",$0,RS)
  40. > }' o    # 粘贴代码。回车,结果如下。

  41. </>
  42. book
  43. 1 (C)<br>
  44. a. 书,书籍; 著作<br>
  45. read [write] a book 读 [著] 书<br>
  46. → closed book,open book.<br>
  47. b. 知识 [教训] 的泉源, (…之) 书<br>
  48. the book of Nature  自然之书<br>
  49. </>
  50. bag
  51. 1 (C)<br>
  52. a. 袋<br>
  53. a paper bag  纸袋<br>
  54. → carry bag,doggie bag,tote bag.<br>
  55. b. 猎物袋<br>
  56. 2 (C)<br>
  57. a. 提袋; 旅行袋,提包<br>
  58. a traveling bag  旅行袋<br>
  59. </>
复制代码

该用户从未签到

50

主题

620

回帖

1万

积分

状元

Rank: 9Rank: 9Rank: 9

积分
12280

灌水大神章小蜜蜂章笑傲江湖章

8
发表于 2013-4-12 20:37:14 | 只看该作者
7# 惟吾无为


看起来很复杂啊,所以曲高和寡,呵

该用户从未签到

14

主题

112

回帖

1032

积分

解元

Rank: 5Rank: 5

积分
1032
9
 楼主| 发表于 2013-4-13 09:43:46 | 只看该作者
4# zhouxl2000
试了好多次,还是不行,可能是我操作有误。
麻烦能不能截屏图片显示一下操作过程?
谢谢!

该用户从未签到

14

主题

112

回帖

1032

积分

解元

Rank: 5Rank: 5

积分
1032
10
 楼主| 发表于 2013-4-13 09:46:05 | 只看该作者
7# 惟吾无为
谢谢援手相助。

该用户从未签到

13

主题

454

回帖

3027

积分

贡士

Rank: 6Rank: 6

积分
3027

灌水大神章

11
发表于 2013-4-13 11:37:51 | 只看该作者
7# 惟吾无为


看起来很复杂啊,所以曲高和寡,呵
sxingbai 发表于 2013-4-12 20:37


sed才叫真的复杂。

上面的代码我加了不少注释,去掉#号开头的行。没多少代码。

该用户从未签到

13

主题

454

回帖

3027

积分

贡士

Rank: 6Rank: 6

积分
3027

灌水大神章

12
发表于 2013-4-13 11:40:41 | 只看该作者
10# tchon


代码改过了。不然行首为大写时没法合并。
之前疏忽,只在注释中修改了,忘改代码了。

该用户从未签到

25

主题

36

回帖

441

积分

禁止发言

积分
441
13
发表于 2013-4-15 16:21:11 | 只看该作者
本帖最后由 zhouxl2000 于 2013-4-15 16:33 编辑
4# zhouxl2000
试了好多次,还是不行,可能是我操作有误。
麻烦能不能截屏图片显示一下操作过程?
谢谢!
tchon 发表于 2013-4-13 09:43


sorry,前面的替代有点问题,将后面的1也包括到单词中。

emeditor可以录制宏,将宏代码保存为test.jsee;
执行时: 宏--选择test.jsee--运行
宏代码:
  1. document.selection.Replace("\\n","", eeReplaceAll | eeFindReplaceRegExp);
  2. document.selection.Replace("</>","\\n</>\\n", eeReplaceAll | eeFindReplaceRegExp);
  3. document.selection.Replace("^([^\\d]+)(\\d.*?)~(.*)$","\\1\\2\\1\\3",eeReplaceAll | eeFindReplaceRegExp);
  4. document.selection.Replace("^([^\\d]+)(\\d.*?)~(.*)$","\\1\\2\\1\\3",eeReplaceAll | eeFindReplaceRegExp);
  5. document.selection.Replace("^([^\\d]+)(\\d.*?)~(.*)$","\\1\\2\\1\\3",eeReplaceAll | eeFindReplaceRegExp);
  6. document.selection.Replace("^([^\\d]+)(\\d.*)$","\\1\\n\\2",eeReplaceAll | eeFindReplaceRegExp);
  7. document.selection.Replace("<br>","<br>\\n",eeReplaceAll | eeFindReplaceRegExp);

复制代码
执行宏后:

  1. </>
  2. book
  3. 1 (C)<br>
  4. a. 书,书籍; 著作<br>
  5. read [write] a book<br>
  6. 读 [著] 书<br>
  7. → closed book,open book.<br>
  8. b. 知识 [教训] 的泉源, (…之) 书<br>
  9. the book of Nature <br>
  10. 自然之书<br>

  11. </>
  12. bag
  13. 1 (C)<br>
  14. a. 袋<br>
  15. a paper bag <br>
  16. 纸袋<br>
  17. → carry bag,doggie bag,tote bag.<br>
  18. b. 猎物袋<br>
  19. 2 (C)<br>
  20. a. 提袋; 旅行袋,提包<br>
  21. a traveling bag <br>
  22. 旅行袋<br>

  23. </>
  24. P.S.我还想将例句的英文和中文摆在同一行,不过可能难度很高?例如:a paper ~ <br>
  25. 纸袋<br>
  26. 改为a paper bag 纸袋<br>
复制代码

该用户从未签到

14

主题

112

回帖

1032

积分

解元

Rank: 5Rank: 5

积分
1032
14
 楼主| 发表于 2013-4-17 23:37:38 | 只看该作者
12# 惟吾无为
谢谢!

该用户从未签到

14

主题

112

回帖

1032

积分

解元

Rank: 5Rank: 5

积分
1032
15
 楼主| 发表于 2013-4-17 23:38:58 | 只看该作者
13# zhouxl2000
好的,谢谢!
现在在外面的电脑没有装上emeditor。等过段时间回家再试一下。
再次谢谢!

该用户从未签到

12

主题

324

回帖

8872

积分

进士

Rank: 8Rank: 8

积分
8872

小蜜蜂章笑傲江湖章灌水大神章

16
发表于 2014-6-18 08:39:39 | 只看该作者
楼主的想法相当好