如何应用正则表达式 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]]/
详情
[
- 一个字符的开始 class(括号表达式)
[:space:]
- POSIX 字符 class 匹配空白字符
&&
- 一个字符class交集运算符
[^\t]
- 制表符以外的任何字符
]
- 字符结束 class(括号表达式)。
详细了解如何使用 character class subtraction in Ruby。
尝试在正则表达式中使用否定前瞻断言:
value.gsub!(/(?!\t)[[:space:]]/, ' ')
否定前瞻将阻止 [[:space:]]
匹配选项卡。
Ruby 似乎支持 perl 的否定 posix 类(虽然我没有看到它被记录:( ),所以你可以这样做:
/[^[:^space:]\t]/
(不是非 space 或制表符)
尝试在 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]]/
详情
[
- 一个字符的开始 class(括号表达式)[:space:]
- POSIX 字符 class 匹配空白字符&&
- 一个字符class交集运算符[^\t]
- 制表符以外的任何字符
]
- 字符结束 class(括号表达式)。
详细了解如何使用 character class subtraction in Ruby。
尝试在正则表达式中使用否定前瞻断言:
value.gsub!(/(?!\t)[[:space:]]/, ' ')
否定前瞻将阻止 [[:space:]]
匹配选项卡。
Ruby 似乎支持 perl 的否定 posix 类(虽然我没有看到它被记录:( ),所以你可以这样做:
/[^[:^space:]\t]/
(不是非 space 或制表符)