Obsidian笔记转为LogSeq笔记

省流:
使用VScode的正则替换(点击搜索中 .* 这个按钮)

1
!\[\[((?<=\[\[).*\.\w{3,4})(\|\w{3})?\]\]

可以匹配诸如![[Pasted image 20230829064601.png|325]]![[Pasted image 20230829064601.png]]格式的文本。

替换框里填

1
![]($1)

则可转化为![](Pasted image 20230829064601.png)
既markdown标准图片格式。
![](/assets/$1) 替换,则可转为![](/assets/Pasted image 20230829064601.png),即LogSeq中的图片格式。

也可以反过来,使用如下表达式

1
!\[\]\((assets/)((?<=).*\.\w{3,4})(?=\))\) 

来匹配 ![](assets/Pasted image 20230829064601.png)
替换为 ![[$2]] 则可得到 ![[Pasted image 20230829064601.png]]


一直都想入门正则,但每次都感觉太复杂而不知道从哪下手。
只有自己真的有需求,且“狠下心来”直接解决问题的时候,才发现问题并没有那么复杂,正则也不是太难。

具体解析

使用\w.*(?=\|\d{3}\]\])
可以匹配

1
![[image-20240406082314566-一个例子.png|250]]

中的image-20240406082314566-一个例子.png

替换为 ![]($1) ,则将上述文字转为![](image-20240406082314566-一个例子.png)
其中$1为之前第一个括号里匹配的字符。
因为\w,为匹配字母、数字、以及下划线和汉字。
.*中,.为匹配除了换行符以外的任意字符,*为匹配尽可能多的字符。
\w.*是指,匹配以字母、数字、以及下划线和汉字为开头的,尽可能多的字符。
(?=\|\d{3}\]\])中,\|\d{3}\]\]中,\|为|的转义,\d{3}为匹配长度为三的任意数字,\]匹配],于是\|\d{3}\]\]表示匹配|123]]这种形式的字符串。
(?= )表示匹配到\|\d{3}\]\]之前的位置,既|123]]这种形式的字符串之前的位置。
同理,使用(\w.*(?=\]\])),表示匹配]]这种形式的字符串之前的位置。
(?<=[[)表示匹配到\[\[之后的位置,既匹配[[这种形式的字符串之后的位置。
这样,我们组合起来,

![[((?<=[[)(\w.*.png(?=]])))]]
写成这样,就是匹配
![[image-20240406082314566-一个例子.png]]
但提出image-20240406082314566-一个例子.png为$1,然后转为

1
![](image-20240406082314566-一个例子.png)

其中 ![[ 匹配![[

1
((?<=\[\[)(\w.*\.png(?=\]\])))

为$! 匹配
image-20240406082314566-一个例子.png
(?<=[[)表示以[[开头的后续
\w.*.png \w为匹配字母或数字或下划线或汉字,.*为贪婪匹配,匹配尽可能多的次数;.png匹配 .png。

(?=]])表示以]]为结尾的后续

1
!\[\[((?<=\[\[)  (.*\.\w.*(?=\]\])))\]\]

..\w. 就直接匹配所有以 字符.字符 结构的。

1
!\[\[((?<=\[\[)(.*\.\w{3,4}(?=\]\])))\]\]

但问题就。。
![[image-20240406082314566-一个例子.png|250]]
这种在]] 前有|250的,咋匹配呢?
加一个匹配|250的部分
![[((?<=[[).*.\w{3,4})(|\w{3})?]]
其中(|\w{3})?表示匹配|250 0次或1次

1
![](assets/$1) 

反过来,也可以
![]((assets/)((?<=).*.\w{3,4})(?=)))
或者在没有asset的字母时
用![](((?<=).*.\w{3,4})(?=)))
替换为

Reference

正则表达式中圆括号的用法–也叫后向引用 - dosir - 博客园
正则表达式30分钟入门教程
正则表达式可视化: Regular Expression Tester and Visualizer