正则表达式 自动复制Java API方法摘要中的表格

正则表达式 自动复制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对象。应该还能再优化优化,以后哪天再说啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值