Ruby 如何编写正则表达式以匹配字符串中的所有单个字符?
我想用空格替换字符串中的所有单个非空白字符 我试过这个Ruby 如何编写正则表达式以匹配字符串中的所有单个字符?,ruby,regex,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 tes
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"
我不确定我在这里遗漏了哪一条正则表达式原则,我需要让它发挥作用。有什么想法吗?这里使用的正则表达式原则是
单词边界
尝试使用\b[A-Za-z]\b
这将在大多数情况下起作用,除非有其他字符而不是单词。如<代码> A@ < /代码>,它将考虑<代码> A <代码>为单个字符,因为在<代码> A<代码> >代码> @ /代码>之间有一个字边界,像这样的代码> A @ < /代码> ./P>
在这种情况下,您还可以使用look around
断言,在字母的两侧查找空格。这样就有资格成为单一字符
Regex:(?这里使用的Regex原则是单词边界
尝试使用\b[A-Za-z]\b
大多数情况下,除非有其他字符,否则这将起作用。如<代码> a @ /代码>,它将考虑<代码> a <代码>为单个字符,因为在<代码> a < /COD>和<代码> @ /代码>之间有一个字边界,如“代码< > @ @ /代码> ./P>
在这种情况下,您还可以使用
look around
assertions,它将在字母的两侧查找space
,从而限定为单个字符
正则表达式:(?您可以像这样使用单词边界\b
:
string = 'This is a x y z test string'
string.gsub(/\b\w\b/, ' ').gsub(/\s{2,}/, ' ')
=> "This is test string"
其他字符可以与以下字符类一起使用:[\w\-]
或非空格字符:(?您可以像这样使用单词边界\b
:
string = 'This is a x y z test string'
string.gsub(/\b\w\b/, ' ').gsub(/\s{2,}/, ' ')
=> "This is test string"
其他字符可以与以下字符类一起使用:[\w\-]
或类似的非空格字符:(?您可以使用正向向前看(或向后看)。然后匹配中不包括前面的空格(或后面有向后看的空格),并替换为空字符串
string = 'This is a x test string'
string.gsub(/(?<=\W|\A).(\W|\z)/, '')
=> "This is test string"
string='这是一个x测试字符串'
string.gsub(/(?“这是测试字符串”
我会将两者之间匹配的字符限制为\w
,并可能移动到支持unicode的字符类。您可以使用正向向前看(或向后看)。然后,匹配中不包括前面的空格(或后面有向后看的空格),并用空字符串替换
string = 'This is a x test string'
string.gsub(/(?<=\W|\A).(\W|\z)/, '')
=> "This is test string"
string='这是一个x测试字符串'
string.gsub(/(?“这是测试字符串”
我会将两者之间匹配的字符限制为\w
,并可能移动到支持unicode的字符类。如果我理解正确,您希望删除单个非空白实例。请尝试替换
\s\S(?!\S)|(?<!\S)\S\s
\s\s(?!\s)|(?
没有任何东西-“”
.如果我理解正确,您希望删除单个非空白实例。请尝试替换
\s\S(?!\S)|(?<!\S)\S\s
\s\s(?!\s)|(?
没有任何东西-“”
.这是一个非regexp版本:
string = 'This is x a test string'
single_character = -> x { x.size == 1 }
p string.split(' ').reject(&single_character).join(' ') #=> "This is test string"
这是一个非regexp版本:
string = 'This is x a test string'
single_character = -> x { x.size == 1 }
p string.split(' ').reject(&single_character).join(' ') #=> "This is test string"
这里的字符是什么?任何字符还是ASCII字母?这是一个x测试字符串的预期输出是什么?请尝试string.gsub(/\s+。(?=\s |\z)/,“”)
如果将所有单个字符替换为一个空格,则始终只会得到一个与原始字符串长度相同的空格序列。一个简单的方法是“”*string.length
。在您的代码中,您不能在编写时用空格替换字符,而是要删除它及其相邻的一个字符。您的问题没有错吗?您想删除所有带有空格的单字符单词,不是吗?如果您想替换,这是一个x测试字符串this是测试字符串(其中
是空格)。这里的字符是什么?任何字符还是ASCII字母?这是x测试字符串的预期输出是什么?请尝试string.gsub(/\s+(?=\s |\z)/,“”)
如果将所有单个字符替换为一个空格,则始终只会得到一个与原始字符串长度相同的空格序列。一个简单的方法是“”*string.length
。在您的代码中,您不能在编写时用空格替换字符,而是要删除它及其相邻的一个字符。您的问题没有错吗?您想删除所有带有空格的单字符单词,不是吗?如果您想替换,这是一个x测试字符串t他的测试字符串是uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(?@DanSingerman:在这种情况下,您需要使用\S
,它是[^\S]
的缩写,而不是[A-Za-z]
。我将很快编辑我的答案。后一个答案很好。第一个答案应该被删除,因为它在“A-b-c”上失败
和family.@mudasobwa:是的,我正在为该异常添加原因。它需要匹配任何非空白字符(我将编辑该问题以反映这一点),基于此,我认为这是可行的:(?@DanSingerman:在这种情况下,您需要使用\S
,它是[^\S]
的缩写,而不是[A-Za-z]
。我将很快编辑我的答案。如果a-b-c
应被视为一个单词,请特别匹配空格,而不是\W
。/(?字符串的开头或结尾有一个边格。如果选择“向前看”,则会在的结尾处留下一个空格“结尾处只有一个字符:a”
。我只想去掉它。如果a-b-c
应被视为一个单词,则专门匹配空格,而不是\W