如何应用正则表达式 POSIX class 减法或等价物?

How can I apply regexp POSIX class subtraction or equivalent?

尝试在 ruby 中执行此操作,但我想这个问题适用于任何处理 POSIX classes

的正则表达式语言

目标:我想用常规单个 space 替换 [[:space:]] POSIX class 以外的所有匹配字符 tab .

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

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

有没有办法重写它,以便我可以用单个常规 space 字符匹配和替换 [[:space:]] class 中找到的任何字符(制表符除外)?

更新

感谢大家的回答。

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

初步测试表明提供了以下 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 实际上并不支持 class 减法而是演示了与负数的交集,我选择这个问题的答案是因为即使是非 POSIX classes.

也知道这一点似乎很好

POSIX [[:space]] class 就是 shorthand for [ \t\r\n\v\f]。因此,您需要做的就是使用相同的模式,除了没有 \t 或 space,因为这就是您要替换的匹配项。

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

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

您可以使用

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

Rubular demo

详情

  • [ - 一个字符的开始 class(括号表达式)
    • [:space:] - POSIX 字符 class 匹配空白字符
    • && - 一个字符class交集运算符
    • [^\t] - 制表符以外的任何字符
  • ] - 字符结束 class(括号表达式)。

详细了解如何使用 character class subtraction in Ruby

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

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

否定前瞻将阻止 [[:space:]] 匹配选项卡。

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

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

(不是非 space 或制表符)