正则表达式-将匹配的文本移动到行的更前面


Regex - moving matched text to earlier in line

我一直在使用正则表达式(在textmate的查找&替换工具)重新格式化一个表的值我已经收到一个PHP数组。

我已经完成了大部分的工作,但还在为最后的改变而挣扎。

当前状态:

$subSectors[1] = 'Crop & Animal Production, Hunting & Related Service Activities'; [1]
$subSectors[2] = 'Forestry & Logging'; [1]

我正在寻找批量替换(100行),以便最后的字符['d{0-3}]移动到主数组键。

那么上面的两行就变成了:

$subSectors[1][1] = 'Crop & Animal Production, Hunting & Related Service Activities';
$subSectors[1][2] = 'Forestry & Logging';

用括号括起来的行尾值长度为1-3位。

我可以使用:

匹配括号内的值
'['d{0,3}]$

但是不知道如何构造替换字符串。

最简单的方法是分别捕获( ),然后进行替换。

Find: ^('$'w+)('['d+'].*?)'s*('['d{0,3}'])$
Replace: $1$3$2

现场演示

如果你想将部分移动到字符串的其他部分,那么你必须扩展你的模式以包含字符串的所有受影响部分,而不仅仅是匹配部分,即[1]部分。

比如:

匹配:

^('$'w+'['d+'])(['s'S]+?)('['d{0,3}'])(?='r|$)

替换:

$1$3$2

你的正则表达式是花式和可爱的,我相信它工作得很好。

如果你已经在使用TextMate,有一个更好的方法。

我制作了一个视频来说明如何使用TextMate的多插入符号功能,这个功能太可爱了,我不介意宣传它。

视频来自screenast.com

我在视频中要做的是;

  • 在你喜欢的行上选择一个列。在视频中,我点击第一行,然后按下option + shift,然后点击最后一行。

  • 向左或向右按箭头键清除所选内容,并以插入符号代替。

  • 按Command + Right键将所有的插入符号移动到各自行的末尾。

  • 按Shift + Option + Left两次。你可以看到TextMate会根据你选择的内容做出不同的选择。

  • Command + X剪切括号内的数字。Textmate会记住你复制它们的顺序。

  • Command Left移回行首,这也会重新对齐插入符号。

  • 选项+右,直到你的位置,粘贴。Textmate会替换你在每个插入符号处剪掉的内容。

它比正则表达式好吗?

  • 它实际上比这个问题上的正则表达式(分别为53或44,计算替换)更少的按键(9)

  • 你不需要理解正则表达式来做

  • 你不需要查找窗口

怎么更糟?

  • 它不是可重用的,所以如果你需要跨5个以上的文件这样做,或者如果你(可能)需要在一个脚本中,构建regex。