我有一个文本文件,其中有一些制表符格式的表格,例如
Num Name val1 val2
1 Str bar baz
2 Dex foo bar
3 Con foo foo
(显然有些人没有读过我的描述,因此感到困惑,所以要澄清一下:这并不代表真实数据。数据是假的,只有格式是真实的。除了数据不包含\t
字符之外,不要对数据做任何假设。)
我想将其转换为 wiki 的语法,其中表格如下所示
{| border=1 cellspacing=0 cellpadding=4 align=left
|- valign=top
! Num !! Name !! val1 !! val2
|-
| 1 || Str || bar || baz
|-
| 2 || Dex || foo || bar
|-
| 3 || Con || foo || foo
|-
|}
我有一组正则表达式搜索/替换来完成大部分工作,但使用 !! 的顶行很不正常。我让标题在第一行的开头添加一个 !,然后使用正则表达式
/![\t ]+([a-zA-Z0-9]+)/
将其替换为
!! \1 !
并应用于所有行。最终,这种方法可行,但目前每行只能工作一次,我需要进行多达十几次。我希望减少所需的点击次数,因为我预计会重复进行此转换。
我非常确定“真正的”正则表达式无法做到这一点,因为它涉及未知数量的捕获组,这些捕获组必须保持不变,因此我期望解决方案将利用 Notepad++ 的其他功能。如果我错了,并且可以使用正则表达式引擎的通用扩展来实现这一点,那也很好。
答案1
这将一次性转换所有数据行。
- Ctrl+H
- 找什么:
(?:(^\d+|\G)\h+(\S+))(\R)?
- 用。。。来代替:
| $1 || $2(?3$3|-$3)
- 查看 环绕
- 查看 正则表达式
- Replace all
解释:
(?: # non capture group
( # group 1
^\d+ # 1 or more digit at begiinning of line
| # OR
\G # restart from last match position
) # end group 1
\h+ # 1 or more horizontal spaces
(\S+) # group 2, 1 or more non spaces
) # end group
(\R)? # group 3, any kind of linebreak, optional
替代品:
| $1 || $2 # pipe space content of group1 space double pipe space content of group 2
(?3 # conditional replacement, if group 3 exists:
$3 # content of group 3
|- # pipe hyphen
$3 # content of group 3
) # end condition
屏幕截图: