Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何编写正则表达式以匹配字符串中的所有单个字符?_Ruby_Regex - Fatal编程技术网

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 strin­g'
string.gsu­b(/\b\w\b/­, ' ').gs­ub(/\s{2,}­/, ' ')
=> "This is test string"

其他字符可以与以下字符类一起使用:
[\w\-]
或非空格字符:
(?您可以像这样使用单词边界
\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"

其他字符可以与以下字符类一起使用:
[\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