如何应用regexp POSIX类减法或等效?

时间:2017-12-27 00:26:57

标签: ruby regex posix

尝试在ruby中执行此操作,但我认为该问题适用于处理POSIX类的任何regexp语言

目标:我希望将[[:space:]] POSIX类除了tab以外的所有字符替换为常规单个空格。

希望字符类减法可以与POSIX类一起使用,我试过这个但它不起作用

value.gsub!(/[ [[:space:]] - [\t] ]/, ' ')

有没有办法重写这个,所以我可以匹配并替换[[:space:]]类中除了带有单个常规空格字符的选项卡之外的任何字符?

更新

感谢所有答案。

我在我的问题中搜索和定义的答案集中在[[:space:]] POSIX类,因为这个类超出了ascii字符和控制字符,并且在unicode中包含不规则或其他非ascii空格等等。因此虽然我同意我可以去构建我自己的类并找到每个可能的空格,但我宁愿利用已定义的现有类来包含那些并删除我想要的类。

初步测试显示以下3个答案提供:

value.gsub!(/(?!\t)[[:space:]]/, ' ')  # appears to be language agnostic regexp approach which is good if needed

value.gsub!(/[[:space:]&&[^\t]]/, ' ') # for languages that don't actually support true class subtraction 

value.gsub!(/[^[:^space:]\t]/, ' ') # inverse or double negative approach

产生预期的结果。我最喜欢前两个,但是因为我最初用ruby构建问题并且答案指出ruby实际上不支持类减法,而是演示了一个带负数的交集,我选择这个问题的答案,因为它似乎即使使用非POSIX类,这也很好。

4 个答案:

答案 0 :(得分:5)

您可以使用

/[[:space:]&&[^\t]]/

请参阅Bitnami - First Steps With The Bitnami WordPress Stack

<强>详情

  • [ - 字符类的开头(括号表达式)
    • [:space:] - 匹配空白字符的POSIX字符类
    • && - 字符类交集运算符
    • [^\t] - 除标签
    • 以外的任何字符
  • ] - 字符类(括号表达式)的结尾。

详细了解如何使用Rubular demo

答案 1 :(得分:2)

尝试在正则表达式中使用否定先行断言:

value.gsub!(/(?!\t)[[:space:]]/, ' ')

否定前瞻会阻止[[:space:]]匹配标签。

答案 2 :(得分:2)

Ruby似乎支持perl的否定posix类(虽然我没有看到它记录:(),所以你可以这样做:

/[^[:^space:]\t]/

(不是非空格或标签)

答案 3 :(得分:0)

POSIX [[:space]]类只是[ \t\r\n\v\f]的简写。因此,您需要做的就是使用相同的模式,除了没有\t,或者空格,因为那样你无论如何都要替换匹配。

value.gsub!(/[\r\n\v\f]/, ' ')

有关详细信息,请参阅https://www.regular-expressions.info/posixbrackets.html