在过去的一个小时里,我一直试图弄清楚这一点,但我没有取得任何成功,想到也许你可以提供帮助。
基本上我有一个html电子邮件文档,它有很多style
属性,用于内联样式的元素看起来有点像
<th rowspan="10" style="font-weight: normal; vertical-align: top; text-align: left;" width="87">
现在我需要做的是删除所有空白区域,使其变为:
<th rowspan="10" style="font-weight:normal;vertical-align:top;text-align:left;" width="87">
在http://www.gskinner.com/RegExr/中玩耍我找到了这个搜索表达式
/style="([\w ;:\-0-9]+)"/gi
只匹配样式属性和内容,但我似乎无法弄清楚如何仅在$ 1捕获组中替换空格。
最终,我会在项目范围内运行此项,以便在重要的情况下在TextMate中进行查找和替换。
如果您没有注意到我是RegEx的新手,请尝试解释您的解决方案,以便我们可以从中学习以供将来参考。
非常感谢阅读,
Jannis
答案 0 :(得分:3)
注意速记属性。例如,在
中style="background: #fff; border: 1px solid #ccc"
...您可以安全地删除前三个空格,但必须保留最后两个,分隔border:
速记值的组成部分。只是为了好玩,这里有一个正则表达式,它删除与属性名称和:
和;
分隔符相邻的任何空格,但不包含属性值:
((?:\sstyle="|(?!\A)\G))\s*+([a-z]++(?>-[a-z]+)*+)\s*+:\s*+([^;]+?)\s*+;
替换为:
$1$2:$3;
在EditPad Pro中测试它,它会转换它(353个字符):
<th rowspan="10" style="font-weight: normal; vertical-align: top; text-align: left;" width="87"><input title="Search" value="" size=57 style="background: #fff; border: 1px solid #ccc ; border-bottom-color: #999; border-right-color:#999;color: #000; font: 18px arial,sans-serif bold; height: 25px; margin: 0; padding: 5px 8px 0 6px; vertical-align: top">
......对此(330个字符):
<th rowspan="10" style="font-weight:normal;vertical-align:top;text-align:left;" width="87"><input title="Search" value="" size=57 style="background:#fff;border:1px solid #ccc;border-bottom-color:#999;border-right-color:#999;color:#000;font:18px arial,sans-serif bold;height:25px;margin:0;padding:5px 8px 0 6px;vertical-align:top">
但我不建议你使用这个或任何正则表达式解决方案;我只是好奇它是否像在EditPad中一样在TextMate中工作。 (TextMate使用Oniguruma正则表达式引擎,它支持所有必要的功能,因此它应该可以工作,但我不能自己测试它。)
但你真正应该用于这项工作的是专用的CSS压缩器/最小化器/缩小器;那里有很多。
答案 1 :(得分:1)
这是一个非常棘手的问题。无法找到执行此操作的单个正则表达式,但您可以使用一系列正则表达式执行此操作:
style="blabla"
出现在单独的行中。 (用特殊字符串标记分隔的行,以便稍后重新加入)。style="blabla"
行进行操作。清除剩余的特殊标记。
这是我用sed做的方式(希望转换为textmate regexp样式很简单):
sed -e 's/\(.*\)\(style="[^"]*"\)\(.*\)/AAA\1\nBBB\2\nCCC\3/g' test.txt | sed '/BBB/s/ //g' | sed -e :a -e '$!N;s/\nBBB//;ta' -e 'P;D' | sed -e :a -e '$!N;s/\nCCC//;ta' -e 'P;D' | sed -e 's/AAA//g'
说明:
sed -e 's/\(.*\)\(style="[^"]*"\)\(.*\)/AAA\1\nBBB\2\nCCC\3/g' test.txt
将带有style =“...”的行分成3行,并用特殊字符串AAA,BBB和CCC标记。 它会导致文件如下:
AAA line before style
BBB line with style=""
CCC line after style
然后我们应用下一个正则表达式:
sed '/BBB/s/ //g'
删除以BBB开头的所有行中的空格(即样式行)
然后我们重新加入:
sed -e :a -e '$!N;s/\nBBB//;ta' -e 'P;D'
将以BBB开头的行追加到前一行(并删除字符串BBB)
然后:
sed -e :a -e '$!N;s/\nCCC//;ta' -e 'P;D'
将以CCC开头的行追加到前一行。
最后:
sed -e 's/AAA//g'
删除特殊字符串AAA。
这肯定是次优的,可以使用regexp以外的方法以更少的努力完成。 (甚至还有用于自动格式化源代码的工具)。 无论如何,这是我能在一小时内做到的。我确信只有一个正则表达式能够满足您的需求,而且很难找到它。