如何编写正则表达式以匹配字符串中的所有单个字符?

时间:2016-04-14 08:37:02

标签: ruby regex

我想用带空格的字符串替换所有单个非空白字符。

我试过这个。

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"  

我不确定我在这里缺少哪种正则表达式原则,我需要做这项工作。有什么想法吗?

5 个答案:

答案 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 strin­g'
string.gsu­b(/\b\w\b/­, ' ').gs­ub(/\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)

如果我理解正确,您希望删除 非空白的单个实例。尝试替换

\s\S(?!\S)|(?<!\S)\S\s

什么都没有 - ""

Se an example here at regex101