正则表达式 自动复制Java API方法摘要中的表格
前言
写博客的时候经常需要复制API,我之前是一条一条的复制,现在看来太low了,所以写个工具来一下子复制整个方法摘要中的表格。完整代码直达
需求
复制javaAPI中文档方法摘要中的方法,然后根据复制的文本生成表格。
复制好的文本如下
需要处理的文本:
void close()
关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit)
标记流中的当前位置。
boolean markSupported()
判断此流是否支持 mark() 操作(它一定支持)。
int read()
读取单个字符。
int read(char[] cbuf, int off, int len)
将字符读入数组的某一部分。
String readLine()
读取一个文本行。
boolean ready()
判断此流是否已准备好被读取。
void reset()
将流重置到最新的标记。
long skip(long n)
跳过字符。
希望处理后的文本为
|方法|描述|
|:-|:-|
|void close() |关闭该流并释放与之关联的所有资源。 |
|void mark(int readAheadLimit) |标记流中的当前位置。 |
|boolean markSupported() |判断此流是否支持 mark() 操作(它一定支持)。 |
|int read() |读取单个字符。 |
|int read(char[] cbuf, int off, int len) |将字符读入数组的某一部分。 |
|String readLine() |读取一个文本行。 |
|boolean ready() |判断此流是否已准备好被读取。 |
|void reset() |将流重置到最新的标记。 |
|long skip(long n) |跳过字符。 |
在markdown文档中显示效果:
方法 | 描述 |
---|---|
void close() | 关闭该流并释放与之关联的所有资源。 |
void mark(int readAheadLimit) | 标记流中的当前位置。 |
boolean markSupported() | 判断此流是否支持 mark() 操作(它一定支持)。 |
int read() | 读取单个字符。 |
int read(char[] cbuf, int off, int len) | 将字符读入数组的某一部分。 |
String readLine() | 读取一个文本行。 |
boolean ready() | 判断此流是否已准备好被读取。 |
void reset() | 将流重置到最新的标记。 |
long skip(long n) | 跳过字符。 |
实现过程步骤:
在方法和解释之间加入分界符,使两者合并到同一行中
可以看到,的顺序是:一行方法,然后下一行是解释。我希望处理后方法和解释在同一行中。
例如:
void close()
关闭该流并释放与之关联的所有资源。
对于这个方法,在方法和解释之间加上一个|
将方法和解释分开。形成:
void close()|关闭该流并释放与之关联的所有资源。
这样的形式,那怎么做呢,观察这个文本。
我们发现,方法和注释之间,有一个换行符,和多个空格。
所以,使用body=body.replaceAll("\\n\\s{2,}", "|");
这句话来吧换行符合多个空格换成”|
“。
代码:
//从剪贴板中获取文本
String body=SysClipboardUtil.getSysClipboardText();
//方法和解释之间加入分界符"|"
body=body.replaceAll("\\n\\s{2,}", "|");
System.out.println(body);
此时运行效果如下。
void close() |关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit) |标记流中的当前位置。
boolean markSupported() |判断此流是否支持 mark() 操作(它一定支持)。
int read() |读取单个字符。
int read(char[] cbuf, int off, int len) |将字符读入数组的某一部分。
String readLine() |读取一个文本行。
boolean ready() |判断此流是否已准备好被读取。
void reset() |将流重置到最新的标记。
long skip(long n) |跳过字符。
在行首行尾之间加入分界符
可以看到我们已经在方法和解释之间成功加入了分界符了,现在还有行首,以及行尾的分界符没有加上,在输出语句前面加上这句body=body.replaceAll("(?m)(^\\s{0,1}|$)", "|");
。
此时的代码为:
//从剪贴板中获取文本
String body=SysClipboardUtil.getSysClipboardText();
//方法和解释之间加入分界符"|"
body=body.replaceAll("\\n\\s{2,}", "|");
body=body.replaceAll("(?m)(^\\s?|$)", "|");
System.out.println(body);
运行结果:
|void close() |关闭该流并释放与之关联的所有资源。 |
|void mark(int readAheadLimit) |标记流中的当前位置。 |
|boolean markSupported() |判断此流是否支持 mark() 操作(它一定支持)。 |
|int read() |读取单个字符。 |
|int read(char[] cbuf, int off, int len) |将字符读入数组的某一部分。 |
|String readLine() |读取一个文本行。 |
|boolean ready() |判断此流是否已准备好被读取。 |
|void reset() |将流重置到最新的标记。 |
|long skip(long n) |跳过字符。 |
|
删除多加入的无用分界符
可以看到,行首和行尾都加上了分界符,并且删除掉了行首多余的空白符了。但是又在最后面的一行了一个|
这个是我们不需要的,应该删掉,body=body.replaceAll("(?m)^\|$","");
修改后的程序:
//从剪贴板中获取文本
String body=SysClipboardUtil.getSysClipboardText();
//方法和解释之间加入分界符"|"
body=body.replaceAll("\\n\\s{2,}", "|");
body=body.replaceAll("(?m)(^\\s?|$)", "|");
body=body.replaceAll("(?m)^\\|$","");
System.out.println(body);
运行结果:
|void close() |关闭该流并释放与之关联的所有资源。 |
|void mark(int readAheadLimit) |标记流中的当前位置。 |
|boolean markSupported() |判断此流是否支持 mark() 操作(它一定支持)。 |
|int read() |读取单个字符。 |
|int read(char[] cbuf, int off, int len) |将字符读入数组的某一部分。 |
|String readLine() |读取一个文本行。 |
|boolean ready() |判断此流是否已准备好被读取。 |
|void reset() |将流重置到最新的标记。 |
|long skip(long n) |跳过字符。 |
现在表格体已经构建好了,还缺表格头,这个就简单了,不再需要使用正则表达式,定义表格头String head="|方法|描述|\n|:-|:-|\n";
,然后head+body
加上表格头就行了,
完整版关键代码
//从剪贴板中获取文本
String body=SysClipboardUtil.getSysClipboardText();
//方法和解释之间加入分界符"|"
body=body.replaceAll("\\n\\s{2,}", "|");
//在行首和行尾加上分界符插入一个|
body=body.replaceAll("(?m)(^\\s?|$)", "|");
body=body.replaceAll("(?m)^\\|$","");
String head="|方法|描述|\n|:-|:-|\n";
body=head+body;
System.out.println(body);
运行结果:
|方法|描述|
|:-|:-|
|void close() |关闭该流并释放与之关联的所有资源。 |
|void mark(int readAheadLimit) |标记流中的当前位置。 |
|boolean markSupported() |判断此流是否支持 mark() 操作(它一定支持)。 |
|int read() |读取单个字符。 |
|int read(char[] cbuf, int off, int len) |将字符读入数组的某一部分。 |
|String readLine() |读取一个文本行。 |
|boolean ready() |判断此流是否已准备好被读取。 |
|void reset() |将流重置到最新的标记。 |
|long skip(long n) |跳过字符。 |
复制上面的运行结果,粘贴到markdown文档中,显示效果如下。
方法 | 描述 |
---|---|
void close() | 关闭该流并释放与之关联的所有资源。 |
void mark(int readAheadLimit) | 标记流中的当前位置。 |
boolean markSupported() | 判断此流是否支持 mark() 操作(它一定支持)。 |
int read() | 读取单个字符。 |
int read(char[] cbuf, int off, int len) | 将字符读入数组的某一部分。 |
String readLine() | 读取一个文本行。 |
boolean ready() | 判断此流是否已准备好被读取。 |
void reset() | 将流重置到最新的标记。 |
long skip(long n) | 跳过字符。 |
吃惊!正则表达式是果然很强大。
完成的代码:
package markdowntools.table;
import clipboard.util.SysClipboardUtil;
public class TableCopyFromAPI
{
public static void main(String[] args)
{
//从剪贴板中获取文本
String body=SysClipboardUtil.getSysClipboardText();
//方法和解释之间加入分界符"|"
body=body.replaceAll("\\n\\s{2,}", "|");
//在行首和行尾加上分界符插入一个|
body=body.replaceAll("(?m)(^\\s?|$)", "|");
//去掉多加入无用的分界符
body=body.replaceAll("(?m)^\\|$","");
//定义表格头部和对齐方式
String head="|方法|描述|\n|:-|:-|\n";
//拼接成完整的markdown表格代码
body=head+body;
//输出到控制台中
// System.out.println(body);
// 处理好的文本写入剪贴板中
SysClipboardUtil.setSysClipboardText(body);
}
}
依赖:clipboard.util.SysClipboardUtil
不足的地方,因为是使用String操作,但是总共产生了6个String对象。应该还能再优化优化,以后哪天再说啦。