如何实现「把一段文字每隔一个字就隐藏一个字」?(内容有改动)

近来用 org-drill 来辅助记忆,看到一个记忆方法,把一段文字每隔一个字就隐藏一个字,类似这样:

方_柳_,乍_花_。但_处,鸟_庭_,将_时,影_回_。仙_乍_兮。闻_兰_馥_。荷_欲_兮,听_佩_铿_。靥_春_兮,云_翠_,唇_樱_兮,榴_含_。纤_之_楚_,回_舞_,珠_之_辉_,满_鹅_。出_花_兮,宜_宜_,徘_池_兮,若_若_。蛾_颦_兮,将_而_语,莲_乍_兮,待_而_行。羡_之_质_,冰_玉_,羡_之_服_,闪_文_。爱_之_容_,香_玉_。美_之_度_,凤_龙_。

这个是隐2 4 6 ……双数字。

_离_坞,_出_房。_行_,_惊_树,_到_,_度_廊。_袂_飘_,_麝_之_郁,_衣_动_,_环_之_锵。_笑_桃_,_堆_髻,_绽_颗_,_齿_香。_腰_楚_兮,_风_雪,_翠_辉_兮,_额_黄。_没_间_,_嗔_喜,_徊_上_,_飞_扬。_眉_笑_,_言_未_,_步_移_,_止_欲_。_彼_良_兮,_清_润,_彼_华_兮,_灼_章。_彼_貌_兮,_培_琢,_彼_态_兮,_翥_翔。

这是隐 1 3 5 …… 单数字。

跳过标点符号等等。

用elisp代码怎么实现这样的功能?处理一个文本文件或选中的文本内容都可。

一个粗糙的实现:

(defun my-hide (beg end)
  (interactive "r")
  (let ((pt beg)
        (i 1))
    (while (< pt end)
      (when (aref (char-category-set (char-after pt)) ?C)
        (when (cl-evenp i)
          (put-text-property pt (1+ pt) 'display "_"))
        (cl-incf i))
      (cl-incf pt))))

(defun my-show (beg end)
  (interactive "r")
  (remove-text-properties beg end '(display)))

上面用 C: Chinese (Han) characters of 2-byte character sets 区别「中文字符」

(aref (char-category-set ?方) ?C)
;; => t

(aref (char-category-set ?,) ?C)
;; => nil

也可用正则表达式(都是一个意思):

(mapcar
 (lambda (c)
   (string-match (rx (category chinese-two-byte))
                 (string c)))
 "方离柳坞,乍出花房。")
;; => (0 0 0 0 nil 0 0 0 0 nil)
6 个赞

昨晚草稿保存了一下,然后死活连不上网站了,以至没法修改,大囧。

隐藏的字(也就是下划线)部分,如果改成在原有的字两边加上 [ 和 ] ,要怎么实现呢?如下:

方[离]柳[坞],乍[出]花[房]……

[方]离[柳]坞,[乍]出[花]房……

这样的。

PS: 有比elisp更便捷的脚本语言实现不?

直接改,意思都一样,你的需求已经说得很清楚了。

用pythoon吧

对unicode的支持好

简单易学 库非常丰富

你可以把它改成一句显示 一句隐藏

python的字符串操作能和perl比?(滑稽)

我说了三条 你却抓住一条不放

易学看人,不置可否。本人就觉得python的语法很怪异,我用Javascript。

库非常丰富,perl也有很多库,不见得py有的perl就没有。再说这本质就是扣字符串。


我只是反感你这种什么都得踏入沙漠构建海洋的想法。这东西Elisp做起来又不麻烦,用py反而可能人家又要重头学

2 个赞

你没有看到问题

既然做起来不麻烦 您就给一个呗

比和别人争论强多了

python不用库可以方便的找出所有Unicode汉字吗?

chunyang已经给了一个了,我就不献丑了

知道20%就要自己懂剩下80%,这应该是你说过的(IIRC)


何为自嘲完美?

我也是服了 你难道只看最后一个帖子吗?

ELISP> (replace-regexp-in-string "\\(\\cC\\)" (concat "[\\1]") "你好騒啊")
"[你][好][騒][啊]"
2 个赞

你居然连审题都不会 你应该没有用过org-drill

你的输出应该是

你[好]騒[啊]

你还得处理逗号、空格、换行符

如果人家要求你显示一句、隐藏一句,你不能做太多的改动。

他已经学到了怎么提取中文字符。我也演示了怎么加方括号。unix思维总得有点吧

(replace-regexp-in-string "\\(\\cC\\)\\(\\cC\\)" "\\1[\\2]" "你好騒啊")
ELISP> (thread-last "你说, 我怎么不从盘古开天僻地开始讲呢???????、\n 对不对?"
         (replace-regexp-in-string (rx (1+ (not (category chinese-two-byte)))) " ")
         (replace-regexp-in-string (rx (group-n 1 (category chinese-two-byte)) (group-n 2 (category chinese-two-byte)))
                                   "\\1[\\2]"))
"你[说] 我[怎]么[不]从[盘]古[开]天[僻]地[开]始[讲]呢 对[不]对 "

有人可以回答我的问题吗


我吹perl干嘛,人家Unicode支持牛批啊!

万一楼主用到了扩展区的字符呢 Elisp也可以正确匹配扩展区字符

4 个赞

老毛病 还真不好改

咱两各自用perl写个实现怎样

要求如下:

输入文本:

易学看人,不置可否。本人就觉得python的语法很怪异,我用Javascript。

输出文本,可根据配置输出四种不同的格式:

格式1:

易[学]看[人],不[置]可[否]。本[人]就[觉]得[python]的[语]法[很]怪[异],我[用]Javascript。

格式2:

[易]学[看]人,[不]置[可]否。[本]人[就]觉[得]python[的]语[法]很[怪]异,[我]用[Javascript]。

格式3:

易学看人,[不置可否]。本人就觉得python的语法很怪异,[我用Javascript]。

格式4:

[易学看人],不置可否。[本人就觉得python的语法很怪异],我用Javascript。
1 个赞

你用JS也行