网友语录 - 第21期 - 当我老去,回顾一生,我想说,“哇,那是一场冒险”;而不是,“哇,我真的很安稳”

这里记录我的一周分享,通常在周六发布。


大多数交易都有有利的一面和不利的一面,但免费让我们忘记了不利的那面。免费使我们造成一种情绪冲动,我们误认为免费物品大大高于它的真正价值。为什么?我认为是由于人类本能的惧怕损失。免费的真正诱惑力与这种惧怕心理密切相关。我们选择免费物品不会有风险,如果我们选择的物品不是免费的,那就有蒙受损失的风险。


世间万物皆为毒药,没有任何东西不是毒药。之所以有些东西不是毒药,只是因为剂量不够。--瑞士医生帕拉塞尔苏斯(Paracelsus)

(凡事有度,“度”的重要性)


顾准:要像小孩捡石子一样为自己收集知识财富。一个人在任何时候都要为自己寻找一个目标,即使明知道这个目标是自欺欺人的,也要向着这个目标奋斗,否则你的生活就没有中心。


杜渥 这里还没真正文明过,世界却已经厌倦了文明。


阳志平 当我老去,回顾一生,我想说,“哇,那是一场冒险”;而不是,“哇,我真的很安稳”

…more

从一句话看男女成长的双重困境

世上所有的女人最终都活成了她们母亲的样子,这是她们的悲剧。而男人不会,这是他们的悲剧。

当我第一次读到这句话时,立刻发现了其中的含糊之处。"男人不会"——究竟是说他们不会活成父亲的样子,还是不会活成母亲的样子?这种含糊激起了我的好奇心,我忍不住想要弄清这句话到底想要表达什么。

不论在东方还是西方,男性往往不自觉地复制父亲的行为模式。他们在成长过程中潜移默化地吸收父亲的处事方式、继承父辈的价值观,自然而然地选择相似的人生道路。从这个角度看,大多数男人真正"不会"的,或许应该是理解并接纳身为女性的母亲的样子。

这种"不会"是几千年来父权社会统治世界的结果。从小,男孩就被告知要坚强、勇敢,不能表现得"像女孩子"。这种教育不仅限制了男性表达情感的能力,也暗含着对女性特质的轻视,不可避免地造成性别冲突。

类似地,这世界上大部分的女性最终通过活成了母亲的样子,进而理解了身为女性不得不对生活做出诸多让步,这是一种清醒的悲剧;而男性却从小被刻意培养得不去理解女性,这是一种傲慢的悲剧。女人的悲剧在于"不得不理解",而男人的悲剧则是"不能理解"。

不论男人还是女人,终其一生都渴望自己成长为一个尽可能完整的人。多元化的社会价值观让人们认识到,人的成长不应被刻板印象所束缚。女权运动的发展不仅为女性带来更多可能性,也使男性有机会学会尊重、理解女性特质,而非本能地排斥它们。社会在进步,这样的悲剧并非不可避免。

看看我自己,我在传统文化环境中长大,喝了足够多的狼奶。幸运地,好奇心促使我阅读,阅读拓宽了我的知识面和视野,进而促使我反思和调整自己的观念。我明白,身为男性,理解和尊重女性不仅对女性有益,也能让自己成为一个更完整的人。

希望这篇短文能让这个世界变得更好一点点。

网友语录 - 第20期 - 别犹犹豫豫,先上路,路上缺啥补啥。

这里记录我的一周分享,通常在周六发布。


萧覃含 别犹犹豫豫,先上路,路上缺啥补啥。


Marskay 我父亲总是对我说:「如果你想跑步,就去跑,不用一定要等着有人陪你一起。因为只要坚持跑下去,迟早在你第五次或第二十次跑步的时候会有志同道合的人找到你,来到你身边。」直到最近我才意识到,这个道理其实在人生的很多方面都适用。


第三夏尔 人就是这么奇怪的动物:时间有限时,还能不断地给自己找事做,当时间趋近无限时,反倒会失去一切动力。 https://thirdshire.com/boreout/ 聊聊 Boreout:工作太闲也会生病 过劳的反面

…more

利用正则表达式精准匹配 Markdown 中的 Tag

在 Markdown 文档中,我们经常会使用 # 来标记标签(tag)。例如,#todo#feature 都可以作为标记嵌入文本中。然而,在 Markdown 中还存在另一种情况:代码块。代码块通常由单个或连续三个反引号(```)包裹,并且代码块内部可能会出现类似 #ff0000 这样的颜色值。如果不加以区分,就会把这些颜色值也识别为标签。

此外,为了避免误判,转义的反引号(\`)也不应被当作真正的分界符。为此,我们需要设计一个既能排除转义反引号,又能将连续的三个反引号作为一个整体处理的正则表达式。

挑战与需求

  • 处理代码块边界:Markdown 支持用单个反引号表示行内代码、用三个反引号表示多行代码块。正则表达式需要区分这两种情况,确保在代码块中的 # 不会被误认为标签前缀。
  • 转义字符的处理:例如 \` 这样的转义反引号不应计入反引号的配对判断中。
  • Tag 匹配规则:标签由 # 开头,后跟 1 至 32 个 Unicode 字母、数字或下划线,且必须在正确的边界下出现。

正则表达式解决方案

经过多次改进,我们最终得到了下面这个正则表达式:

(?=(?:(?:[^`]|\\`)*(?<!\\)(?<delim>```|`)(?:[^`]|\\`)*(?<!\\)(\k<delim>))*(?:[^`]|\\`)*$)(?<=(?:^|[^\\])#)[\p{L}_\p{N}]{1,32}(?=[^\p{L}\p{N}_]|$)

让我们逐步解析这条表达式的关键部分:

1. 保证反引号成对出现

表达式的开头部分使用了复杂的正向前瞻:

(?=(?:(?:[^`]|\\`)*(?<!\\)(?<delim>```|`)(?:[^`]|\\`)*(?<!\\)(\k<delim>))*(?:[^`]|\\`)*$)
  • 核心思想:通过匹配一系列非反引号或转义反引号的字符,再加上捕获组 (?<delim>```|)`,我们捕获了第一次出现的“分界符”——它可能是单个反引号,也可能是连续三个反引号。
  • 反向引用:利用 \k<delim>,确保后续匹配的分界符与前面捕获到的完全一致。这样,无论遇到的是行内代码还是代码块,都只视作一个整体。
  • 成对匹配:整个正向前瞻确保了目标区域内所有未转义的反引号都是成对出现的,避免了误将代码块内部的内容当作标签判断依据。

2. 确保标签前缀正确

接下来的部分:

(?<=(?:^|[^\\])#)
  • 作用:这个正向后查断言确保了标签必须由一个 # 开头,而这个 # 不能被反斜杠转义(即不应为 \#)。

3. 匹配 Tag 内容

标签的主体部分由下面这段完成:

[\p{L}_\p{N}]{1,32}(?=[^\p{L}\p{N}_]|$)
  • 匹配范围:这里 [\\p{L}_\\p{N}] 表示 Unicode 字母、数字以及下划线。{1,32} 限定了标签的长度为 1 至 32 个字符。
  • 边界条件:紧跟的正向查找断言 (?=[^\p{L}\p{N}_]|$) 确保标签后面紧跟的是非单词字符或已经到达字符串末尾,防止匹配到类似 #todoing 这种不完整的标签。

小结

这条正则表达式综合了多种复杂情况,既能处理 Markdown 中单反引号和三反引号的代码块,又能排除转义反引号的干扰,同时严格匹配标签格式。对于开发者来说,这样的表达式在解析 Markdown 文档、提取标签或进行格式化处理时非常有用。

当然,正则表达式的可读性和维护性是一个平衡点。虽然这条表达式在处理边界情况时表现出色,但在实际应用中可能还需要根据具体场景做出微调。希望这篇文章能为你在 Markdown 文档解析方面提供一些灵感和帮助。

网友语录 - 第19期 - 生活,一半是回忆,一半是继续

这里记录我的一周分享,通常在周六发布。


“嗯,我有几棵枯树需要伐掉……车库里都有些什么工具呢?两个榔头、一些钉子,几把铁锹,还有一把手锯。啊,太好了,有把手锯。”

环境影响人的思维,车库里没有电锯,这个人就想不到借一把电锯来干活。然而,合适工具的生产力是蹩脚工具几十倍。

在挽起袖子大干一场之前,思量一下手头的“最近便的工具”,也是“最适合的工具”吗?还是只是“凑和将就”着用?“凑和将就”其实是在欠债,而欠下的债总是要还的。 -- 书摘《你就是极客》

…more