【发布时间】:2017-06-09 10:58:25
【问题描述】:
我正在尝试从字符串中删除非字母。这样做会不会:
c = o.replace(o.gsub!(/\W+/, ''))
【问题讨论】:
-
你能稍微描述一下吗,你只想要a-z吗?还是空格和某些符号但不是数字?
我正在尝试从字符串中删除非字母。这样做会不会:
c = o.replace(o.gsub!(/\W+/, ''))
【问题讨论】:
gsub! 就足够了:
o.gsub!(/\W+/, '')
注意gsub! 修改了原来的o 对象。另外,如果o不包含任何非单词字符,结果将是nil,所以使用返回值作为修改后的字符串是不可靠的。
你可能想要这个:
c = o.gsub(/\W+/, '')
【讨论】:
! 版本修改了原来的版本(这就是! 的意思——这是一种“当心,我正在改变你叫我的对象”的标志)。没有! 的版本(在我的第二个代码示例中)可以满足您的要求——它不会就地修改字符串,而是返回应用了替换的副本
删除任何不是字母的内容:
> " sd 190i.2912390123.aaabbcd".gsub(/[^a-zA-Z]/, '')
"sdiaaabbcd"
编辑:正如 ikegami 指出的那样,这没有考虑重音字符、变音符号和其他类似字符。这个问题的解决方案将取决于您所指的“不是字母”。另外,您的输入将是什么。
【讨论】:
请记住,ruby 将下划线_ 视为单词字符。所以如果你也想保留下划线,应该这样做
string.gsub!(/\W+/, '')
否则,您需要这样做:
string.gsub!(/[^a-zA-Z]/, '')
【讨论】:
这适用于大多数情况,除非o 最初不包含任何非字母,在这种情况下gsub! 将返回nil。
如果你只想要一个替换的字符串,它可以更简单:
c = o.gsub(/\W+/, '')
【讨论】:
使用\W 或\w 仅选择或删除字符将不起作用。 \w 表示 A-Z、a-z、0-9 和“_”:
irb(main):002:0> characters = (' ' .. "\x7e").to_a.join('')
=> " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
irb(main):003:0> characters.gsub(/\W+/, '')
=> "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
因此,使用\W 进行剥离会保留数字和下划线。
如果要匹配字符,请使用/[A-Za-z]+/,或POSIX 字符类[:alpha:],即/[[:alpha:]]+/,或/\p{ALPHA}/。
最终格式是 ASCII 中 'A'..'Z' + 'a'..'z' 的 Unicode 属性,并且在处理 Unicode 时得到扩展,所以如果你有多字节字符,你可能应该使用它.
【讨论】:
使用 Regexp#union 创建一个大的匹配对象
allowed = Regexp.union(/[a-zA-Z0-9]/, " ", "-", ":", ")", "(", ".")
cleanstring = dirty_string.chars.select {|c| c =~ allowed}.join("")
【讨论】:
如果你有一个字符串,我看不出o.replace 是做什么用的:
string = 't = 4 6 ^'
你做到了:
string.gsub!(/\W+/, '')
你得到:
t46
如果你也想去掉数字字符,你可以这样做:
string.gsub!(/\W+|\d+/, '')
你会得到:
t
【讨论】: