如何使用正则表达式格式化给定的字符串?

时间:2012-10-07 15:13:21

标签: regex formatting

所以我在我的文件中以这种方式定义了变量:

public static final String hello_world = "hello world" 
public static final String awesome_world = "awesome world"
public static final String bye_world= "bye world"

我有很多这样的声明。

是否可以将它们格式化为(行中的所有'='):

public static final String hello_world   = "hello world" 
public static final String awesome_world = "awesome world"
public static final String bye_world     = "bye world"

我甚至想不出办法。任何形式的帮助表示赞赏。

P.S如果重要,我使用崇高的文字2。

4 个答案:

答案 0 :(得分:2)

如果是一次性任务,您可以尝试以下方法:

使用“列中的文本”功能(分隔符:空格)将文本文件导入到例如Excel中,以便列A在每行中包含“public”,列B“静态”,...,列E变量名,列F是“=”符号,列G是变量值(字符串)。

然后将以下公式放入单元格H1(并将其复制到其他行):

="public static final String "&E1&REPT(" ";50-LEN(E1))&" = "&""""&G1&""""

之后,H列包含以下输出:

public static final String hello_world                                        = "hello world"
public static final String awesome_world                                      = "awesome world"
public static final String bye_world                                          = "bye world"

请注意,如果您的Excel语言不是英语,则Excel函数REPT和LEN的名称会有所不同。

答案 1 :(得分:1)

如果您对原始布局要小心(例如,=符号与变量名称分开,例如,与示例中的第三行数据不同),那么这将完成工作:< / p>

awk '{ if (length($5) > max) max = length($5);
       name[NR] = $5; value[NR] = $0; sub(/^[^"]*"/,  "\"", value[NR]); }
 END { format = sprintf("public static final String %%-%ds = %%s\n", max);
       for (i = 1; i <= NR; i++) printf(format, name[i], value[i]); }'

它假设您正在处理'public static final String'(但不验证)。它跟踪它读取的最长名称的长度(第1行),以及变量名称和从打开的双引号到行尾(第2行)的材料。最后,它生成一个格式字符串,它将在字段中打印左对齐的变量名称,只要最长(第3行)。然后将其应用于保存的数据(第4行),生成:

public static final String hello_world   = "hello world" 
public static final String awesome_world = "awesome world"
public static final String bye_world     = "bye world"

为了使它具有防弹性(例如原始数据),你必须更努力地工作,尽管它不应该是不可克服的。草率原始格式的最简单修复方法是使用以下方法预过滤数据:

sed 's/=/ = /'

适当间隔输入周围的额外空间不会影响输出,3个采样数据行中的缺失空格是固定的。在awk内执行此操作会很繁琐,因为您希望它在编辑后重新分割该行。你可以在Perl中做一些非常相似的事情。

鉴于要处理的数据量不可能在兆字节范围内,更不用说更大,这两个命令命令解决方案是完全合理的;您不太可能衡量sed流程的费用。

答案 2 :(得分:0)

没有单一的正则表达式可以解决您的问题。您唯一的选择是运行一系列正则表达式,一个用于处理每个行长度:

s/^(.{40})=/\1 =/
s/^(.{39})=/\1  =/
s/^(.{38})=/\1   =/

即便如此,这可能不是你想要的,而且可能更容易手工制作。

问题在于,正则表达式替换在不同时间插入不同字符串的唯一方法是,它插入的是backref,并且没有backref为您提供5 - N空格字符。你的另一个选择是尝试捕获一个可变数量的字符,但在这种情况下,你也无法做到这一点。

正则表达不是为了做那样的事情(他们不支持算术),而是一些文本编辑器,所以只需找一个花哨的文本编辑器或手工完成。

答案 3 :(得分:0)

由于您使用的是Sublime Text 2,因此有一种更简单的方法 Sublime Text 2有一个很棒的软件包,可以完全你想要的东西:

  

Sublime Alignment

     

多线选择的简单对齐和   Sublime Text 2的多个选择。

     

功能

     
      
  • 通过插入空格(或。)将多个选择对齐到同一列   标签)
  •   
  • 将多行选择中的所有行对齐到相同的缩进   等级
  •   
  • 将多行选择的每一行上的第一个=对齐   同栏
  •   

在:

enter image description here

后:

enter image description here