正则表达式应用:复制按行分隔的表格
需求
把上面的文字转成markdown表格
处理的文本:
复制上面的表格中的文字,然后粘贴,看看复制到的文本有什么规律:
B b
如果参数arg 为 null,则结果为 "false"。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 "true"。
H h
如果参数arg 为 null,则结果为 "null"。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。
S s
如果参数arg 为 null,则结果为 "null"。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。
实现过程
使用正则表达式删除空白行
可以看到复制到的表格是一行一行的,而且还有多个空白行分隔开了,先来去除掉这些空白行:
//删除空白行
body=body.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");
处理后的结果如下:
B b
如果参数arg 为 null,则结果为 "false"。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 "true"。
H h
如果参数arg 为 null,则结果为 "null"。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。
S s
如果参数arg 为 null,则结果为 "null"。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。
使用正则表达式把两行合并为一行
空白行去掉了,来把两行合并为一行:
//两行合并为一行,中间用表格分隔符分隔开
body=body.replaceAll("(.+)\\n(.+)(\\n)?", "$1|$2\n");
运行结果为:
B b|如果参数arg 为 null,则结果为 "false"。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 "true"。
H h|如果参数arg 为 null,则结果为 "null"。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。
S s|如果参数arg 为 null,则结果为 "null"。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。
使用正则表达式分别在行首和行尾加上分割符
然后在每行头尾加上表格分隔符:
//行首和行尾加入结束符
body=body.replaceAll("(?m)(?:^|$)", "|");
运行结果为:
|B b|如果参数arg 为 null,则结果为 "false"。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 "true"。|
|H h|如果参数arg 为 null,则结果为 "null"。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。|
|S s|如果参数arg 为 null,则结果为 "null"。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。|
|
删除多加入的分割符
这里多加上了一个分隔符,删掉这个分隔符:
// 去掉多加入无用的分界符
body = body.replaceAll("(?m)^\\|$", "");
运行结果:
|B b|如果参数arg 为 null,则结果为 "false"。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 "true"。|
|H h|如果参数arg 为 null,则结果为 "null"。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。|
|S s|如果参数arg 为 null,则结果为 "null"。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。|
加上表格头部
可以看到,到这里表体已经生成完毕,加上表格头就行了。
// 定义表格头部和对齐方式
String head = "|方法|描述|\n|:-|:-|\n";
// 拼接成完整的markdown表格代码
body = head + body;
运行结果:
|方法|描述|
|:-|:-|
|B b|如果参数arg 为 null,则结果为 "false"。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 "true"。|
|H h|如果参数arg 为 null,则结果为 "null"。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。|
|S s|如果参数arg 为 null,则结果为 "null"。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。|
可以看到到这里就处理完毕了,把生成的markdown表格粘贴到markdown文档中,就可以显示,显示效果如下:
方法 | 描述 |
---|---|
B b | 如果参数arg 为 null,则结果为 “false”。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 “true”。 |
H h | 如果参数arg 为 null,则结果为 “null”。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。 |
S s | 如果参数arg 为 null,则结果为 “null”。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。 |
表格的每一行的第一个单元格都设置为代码块
在表格头定义语句之前加上:
//注意了使用正则表达式匹配|一定要转义啊!,错误的时候对元字符转义一下!
body=body.replaceAll("(?m)^\\|(.+)\\|(.+)\\|$", "|`$1`|$2|");
运行结果:
|方法|描述|
|:-|:-|
|`B b`|如果参数arg 为 null,则结果为 "false"。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 "true"。|
|`H h`|如果参数arg 为 null,则结果为 "null"。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。|
|`S s`|如果参数arg 为 null,则结果为 "null"。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。|
显示效果:
方法 | 描述 |
---|---|
B b | 如果参数arg 为 null,则结果为 “false”。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 “true”。 |
H h | 如果参数arg 为 null,则结果为 “null”。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。 |
S s | 如果参数arg 为 null,则结果为 “null”。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。 |
完整的代码
package markdowntools.table;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import clipboard.util.SysClipboardUtil;
public class MDTableCopyByLine
{
public static void main(String[] args)
{
String body=SysClipboardUtil.getSysClipboardText();
//删除空白行
body=body.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");
//两行合并为一行,中间用表格分隔符分隔开
body=body.replaceAll("(.+)\\n(.+)(\\n)?", "$1|$2\n");
//行首和行尾加入结束符
body=body.replaceAll("(?m)(?:^|$)", "|");
// 去掉多加入无用的分界符
body = body.replaceAll("(?m)^\\|$", "");
//注意了使用正则表达式匹配|一定要转义啊!,错误的时候对元字符转义一下!
body=body.replaceAll("(?m)^\\|(.+)\\|(.+)\\|$", "|`$1`|$2|");
// 定义表格头部和对齐方式
String head = "|方法|描述|\n|:-|:-|\n";
// 拼接成完整的markdown表格代码
body = head + body;
// 处理好的文本写入剪贴板中
SysClipboardUtil.setSysClipboardText(body);
System.out.println(body);
}
}