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

Dan*_*man 0 ruby regex

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

我试过这个。

string = 'This is a test string'
string.gsub(/(\W|\A).(\W|\z)/, ' ')
 => "This is test string" 
Run Code Online (Sandbox Code Playgroud)

这很好用。但是如果我有两个连续的单个字符,它只会找到第一个。

string = 'This is a x test string'
string.gsub(/(\W|\A).(\W|\z)/, ' ')
 => "This is x test string"  
Run Code Online (Sandbox Code Playgroud)

我不确定我在这里缺少哪个正则表达式原则,我需要完成这项工作。有任何想法吗?

小智 5

这里使用的正则表达式原则是word boundary.

尝试使用\b[A-Za-z]\b Regex101 演示

这将在大多数情况下起作用,除非有一些其他字符而不是单词。比如a@那么它会认为a是单个字符,因为a和之间有一个单词边界,@就像这样a|@

在这种情况下,您还可以使用look-aroundspace在字母两侧查找的断言。从而有资格作为单个字符。

正则表达式: (?<=\s)[A-Za-z](?=\s) Regex101 演示


更新 #1:

对于非空白字符使用\S[^\s]在搜索模式中。

Regex will(?<=\s)[^\s](?=\s)(?<=\s)\S(?=\s) Regex101 Demo


更新#2:

要在字符串的开头或结尾进行匹配,请添加^并添加$到环视断言中。

正则表达式: (?<=^|\s)[^\s](?=\s|$) Regex101 演示

注意:-使用 used \Aand\z而不是^and$如果后者不起作用。