Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何应用regexp POSIX类减法或等效方法?_Ruby_Regex_Posix - Fatal编程技术网

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

Ruby 如何应用regexp POSIX类减法或等效方法?,ruby,regex,posix,Ruby,Regex,Posix,试图在ruby中实现这一点,但我认为这个问题适用于任何处理POSIX类的regexp语言 目标:我想用一个常规的空格替换与[[:space:]POSIX类匹配的所有字符,除了选项卡 我希望字符类减法可以与POSIX类一起使用,我尝试了这个方法,但没有成功 value.gsub!(/[:space:]-[\t]]/,“”) 有没有办法重写它,这样我就可以匹配并替换[[:space:]类中找到的任何字符,除了制表符外,还有一个常规的空格字符 更新 谢谢你的回答 我在问题中搜索并定义的答案集中在[[

试图在ruby中实现这一点,但我认为这个问题适用于任何处理POSIX类的regexp语言

目标:我想用一个常规的空格替换与
[[: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]]/

详细信息

  • [
    -字符类的开头(括号表达式)
    • [:space::
      -匹配空白字符的POSIX字符类
    • &&
      -字符类相交运算符
    • [^\t]
      -选项卡以外的任何字符
  • ]
    -字符类的结尾(括号表达式)
查看有关如何使用的更多信息。

您可以使用

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

详细信息

  • [
    -字符类的开头(括号表达式)
    • [:space::
      -匹配空白字符的POSIX字符类
    • &&
      -字符类相交运算符
    • [^\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