Ruby 如何应用regexp POSIX类减法或等效方法?
试图在ruby中实现这一点,但我认为这个问题适用于任何处理POSIX类的regexp语言 目标:我想用一个常规的空格替换与Ruby 如何应用regexp POSIX类减法或等效方法?,ruby,regex,posix,Ruby,Regex,Posix,试图在ruby中实现这一点,但我认为这个问题适用于任何处理POSIX类的regexp语言 目标:我想用一个常规的空格替换与[[:space:]POSIX类匹配的所有字符,除了选项卡 我希望字符类减法可以与POSIX类一起使用,我尝试了这个方法,但没有成功 value.gsub!(/[:space:]-[\t]]/,“”) 有没有办法重写它,这样我就可以匹配并替换[[:space:]类中找到的任何字符,除了制表符外,还有一个常规的空格字符 更新 谢谢你的回答 我在问题中搜索并定义的答案集中在[[
[[:space:]
POSIX类匹配的所有字符,除了选项卡
我希望字符类减法可以与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类,也很高兴知道这个问题。POSIX
[[:space]]
类只是[\t\r\n\v\f]
的简写。因此,您所需要做的就是使用相同的模式,除了不使用\t
或空格之外,因为这就是您要用的替换匹配项的方式
value.gsub!(/[\r\n\v\f]/,“”)
有关更多信息,请参见POSIX
[[:space]]
类只是[\t\r\n\v\f]
的简写。因此,您所需要做的就是使用相同的模式,除了不使用\t
或空格之外,因为这就是您要用的替换匹配项的方式
value.gsub!(/[\r\n\v\f]/,“”)
有关更多信息,请参见您可以使用的
/[[:space:]&&[^\t]]/
见
详细信息
-字符类的开头(括号表达式)[
-匹配空白字符的POSIX字符类[:space::
-字符类相交运算符&&
-选项卡以外的任何字符[^\t]
-字符类的结尾(括号表达式)]
/[[:space:]&&[^\t]]/
见
详细信息
-字符类的开头(括号表达式)[
-匹配空白字符的POSIX字符类[:space::
-字符类相交运算符&&
-选项卡以外的任何字符[^\t]
-字符类的结尾(括号表达式)]
有关如何使用的详细信息,请参见。尝试在正则表达式中使用负前瞻断言:
value.gsub!(/(?!\t)[[:space:]]/, ' ')
负前瞻将阻止
[[:space:]
匹配选项卡。尝试在正则表达式中使用负前瞻断言:
value.gsub!(/(?!\t)[[:space:]]/, ' ')
反向前瞻将阻止
[:space:][]
匹配选项卡。Ruby似乎支持perl的反向posix类(尽管我没有看到它的文档:()),因此您可以:
/[^[:^space:]\t]/
(不是非空格或制表符)Ruby似乎支持perl的否定posix类(尽管我没有看到它的文档:(),所以您可以:
/[^[:^space:]\t]/
(不是非空格或制表符)为什么不编写自己的类呢?
[\r\n\v\f]
“foo\t bar baz”。gsub(/[^\S\t]/,“”)
完成了trickWrong技巧。技巧需要包括[:space:]的所有可能匹配项,包括全宽字符(如日语等)空格和其他不可打印字符的化身。您是否尝试过使用负面前瞻?请尝试(?!\t)[space:]
Hmm,还没有。我回到计算机后会尝试。为什么不编写您自己的类呢?[\r\n\v\f]
“foo\t bar baz”.gsub(/[^\S\t]/,“”)执行了TrickRong技巧。技巧需要包括[[:space:]的所有可能匹配项,包括全宽字符(即日语等)空格,以及其他不可打印字符的化身。您是否尝试过使用负前瞻性?请尝试(?!\t)[[:space:]
Hmm,还没有。我回到电脑后会试试。它包含的不仅仅是那些字符,比如ascii集以外的全宽字符。它包含的不仅仅是那些字符,比如ascii集以外的全宽字符。我很好奇你们是否有类似的方法来做这个减法(或者通过与一个求反的字符相交进行减法)当使用tr
或sed
时?我最初使用tr
进行的测试似乎没有产生正确的结果。我需要构建一个与ruby解决方案相对应的解决方案,该解决方案在ruby环境之外使用unix系统工具(以在处理大文件时加快速度)@StreamlineRuby使用Onigom正则表达式库,它不是POSIX,而是NFA正则表达式库。您当前问题中唯一的POSIX是POSIX字符类,a[:]
construct.POSIX正则表达式引擎如sed
没有字符类减法功能。嗯,不确定那里的POSIX字符类是否支持Unicode。您可以尝试将一个反括号表达式与POSIX字符类相结合,并在那里添加排除的字符,类似于[^\t[:graph:]
-任何不是可打印字符且不是制表符的字符。在sed
中,添加-E
选项以启用ERE POSIX语法。我很好奇您是否有si