我想用带空格的字符串替换所有单个非空白字符。
我试过这个。
string = 'This is a test string'
string.gsub(/(\W|\A).(\W|\z)/, ' ')
=> "This is test string"
哪个效果很好。但如果我有两个连续的单个字符,它只找到第一个。
string = 'This is a x test string'
string.gsub(/(\W|\A).(\W|\z)/, ' ')
=> "This is x test string"
我不确定我在这里缺少哪种正则表达式原则,我需要做这项工作。有什么想法吗?
答案 0 :(得分:4)
这里使用的正则表达式原则是word boundary
。
尝试使用\b[A-Za-z]\b
Regex101 Demo
这大部分时间都有效,除非有其他字符而不是单词。例如a@
,它会将a
视为单个字符,因为a
和@
之间有一个字边界,如a|@
。
在这种情况下,你也可以使用look-around
断言,它会在字母的两边寻找space
。以便有资格成为单一角色。
正则表达式: (?<=\s)[A-Za-z](?=\s)
Regex101 Demo
更新#1:
对于非空格字符,请在搜索模式中使用\S
或[^\s]
。
正则表达式将是(?<=\s)[^\s](?=\s)
或(?<=\s)\S(?=\s)
Regex101 Demo
更新#2:
要在字符串的开头或结尾处进行匹配,请将^
和$
添加到外观断言中。
正则表达式: (?<=^|\s)[^\s](?=\s|$)
Regex101 Demo
注意: - 如果后者不起作用,请使用已使用的\A
和\z
代替^
和$
。
答案 1 :(得分:1)
这是一个非正则表达式版本:
string = 'This is x a test string'
single_character = -> x { x.size == 1 }
p string.split(' ').reject(&single_character).join(' ') #=> "This is test string"
答案 2 :(得分:0)
您可以像这样使用字边界\b
:
string = 'This is a x y z test string'
string.gsub(/\b\w\b/, ' ').gsub(/\s{2,}/, ' ')
=> "This is test string"
其他字符可以与char类一起使用:[\w\-]
或不像这样的空格字符:(?<=\s)\S(?=\s)
答案 3 :(得分:0)
您可以使用正向前瞻(或后仰)。那么之前(或后面的)后面的空格将不会包含在匹配中,并用空字符串替换。
string = 'This is a x test string'
string.gsub(/(?<=\W|\A).(\W|\z)/, '')
=> "This is test string"
我将之间匹配的字符限制为\w
,并且可能会转移到知道unicode的字符类。
答案 4 :(得分:0)