尝试在ruby中执行此操作,但我认为该问题适用于处理POSIX类的任何regexp语言
目标:我希望将[[:space:]]
POSIX类除了tab
以外的所有字符替换为常规单个空格。
希望字符类减法可以与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类,这也很好。
答案 0 :(得分:5)
您可以使用
/[[:space:]&&[^\t]]/
请参阅Bitnami - First Steps With The Bitnami WordPress Stack
<强>详情
[
- 字符类的开头(括号表达式)
[:space:]
- 匹配空白字符的POSIX字符类&&
- 字符类交集运算符[^\t]
- 除标签]
- 字符类(括号表达式)的结尾。详细了解如何使用Rubular demo。
答案 1 :(得分:2)
尝试在正则表达式中使用否定先行断言:
value.gsub!(/(?!\t)[[:space:]]/, ' ')
否定前瞻会阻止[[:space:]]
匹配标签。
答案 2 :(得分:2)
Ruby似乎支持perl的否定posix类(虽然我没有看到它记录:(),所以你可以这样做:
/[^[:^space:]\t]/
(不是非空格或标签)
答案 3 :(得分:0)
POSIX [[:space]]
类只是[ \t\r\n\v\f]
的简写。因此,您需要做的就是使用相同的模式,除了没有\t
,或者空格,因为那样你无论如何都要替换匹配。
value.gsub!(/[\r\n\v\f]/, ' ')
有关详细信息,请参阅https://www.regular-expressions.info/posixbrackets.html