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

Str*_*ine 1 ruby regex posix

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

目标:我想替换所有匹配[[:space:]]POSIX类的字符,除了a tab,使用常规单个空格.

希望字符类减法适用于POSIX类,我试过这个但是它不起作用

value.gsub!(/[ [[:space:]] - [\t] ]/, ' ')
Run Code Online (Sandbox Code Playgroud)

有没有办法重写这个,所以我可以匹配和替换类中的任何字符,[[: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
Run Code Online (Sandbox Code Playgroud)

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

Wik*_*żew 5

你可以用

/[[:space:]&&[^\t]]/
Run Code Online (Sandbox Code Playgroud)

请参阅Rubular演示

细节

  • [ - 开始一个字符类(括号表达式)
    • [:space:] - 匹配空格字符的POSIX字符类
    • && - 字符类交集运算符
    • [^\t] - 除标签之外的任何字符
  • ] - 字符类的结尾(括号表达式).

查看有关如何在Ruby中使用字符类减法的更多信息.