如何替换某些字符周围的空白?

时间:2011-01-21 03:49:49

标签: regex

我正在处理一些自由文本,因为我需要做一些数据清理,我有一个问题(很多,我稍后会问,我肯定):

我需要更换以下组合:

[ ; ](标点符号前后的空格)

[;](标点符号前后没有空格)

[ ;](标点符号前只有空格)

[; ](标点符号后面只有空格)

...标点符号可以是[;:,.]之一。我怎么能用正则表达式做到这一点?

3 个答案:

答案 0 :(得分:6)

可能的表达方式是:

\s?([;:,.])\s?

并且根据您使用的编程语言或工具,您必须使用$1\\1\1作为反向引用,并且替换将是例如。 $11之后有一个空格。)

<强>解释

\s?      - match at most one whitespace character
 (...)   - capture group, storing the matched characters in a reference
  [...]  - character class, matching one of the characters inside

参考文献: character classcapture groupquantifier

但是:表达式可能会有所不同,具体取决于您使用的工具/语言。例如。 sed的类似表达式如下:

/ *\([;:,.]\) */\1 /

但这也会修剪标点符号周围的空格(可能有更好的方法,但我对sed不太熟悉。)

答案 1 :(得分:2)

我会使用\s*([;:,.])\s*并替换为'$1 '(添加单引号以强调反向引用后的空格。这是Felix的第一个和最后一个建议之间的交叉,因此它可以清理多个空格,包括标签和换行符。

答案 2 :(得分:0)

这取决于您在如何将其移动到已清理的表单[; ]中使用的语言,但您可以通过将它们括在{{{}}中来匹配任何标点符号。 1}},与[]一样。

完成模式后,可以用干净的版本替换匹配项。至少在Java中,您可以使用[;:,.]之类的内容替换它,"\[$<GroupNumber> \]"引用带括号标记的带括号的组,如1,2,3等,基于顺序小组。

请记住,根据您使用的语言,您可能需要转义反斜杠。如果您使用的是Java,那么对于上面的所有示例,您需要使用<GroupNumber>代替\\