Ruby 正则表达式删除非字母
我正在尝试从字符串中删除非字母。这是否可以做到:Ruby 正则表达式删除非字母,ruby,regex,Ruby,Regex,我正在尝试从字符串中删除非字母。这是否可以做到: 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]/, '
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所指出的,这并不考虑重音字符、元音和其他类似字符。这个问题的解决方案将取决于你所说的“不是一封信”。另外,您的输入将是什么。这将适用于大多数情况,除非o
最初不包含任何非字母,在这种情况下gsub
将返回nil
如果只需要替换字符串,则可以更简单:
c = o.gsub(/\W+/, '')
如果您有一个字符串,我看不出该o.replace
用于什么:
string = 't = 4 6 ^'
而你做到了:
string.gsub!(/\W+/, '')
你会得到:
t46
如果您还想删除数字字符,可以执行以下操作:
string.gsub!(/\W+|\d+/, '')
你会得到:
t
使用\W
或\W
仅选择或删除字符无效<代码>\w
表示A-Z、A-Z、0-9和“uz”:
irb(main):002:0>字符=(“”.“\x7e”)。到连接(“”)
=> " !\"\#$%&'()*+,-./0123456789:;?@abcdefghijklmnopqrstuvxyz[\\]^`abcdefghijklmnopqrstuvxyz{124;}”
irb(主):003:0>characters.gsub(/\W+/,“”)
=>“0123456789ABCDefghijklmnopqrstuvxyz_ABCDefghijklmnopqrstuvxyz”
因此,使用\W
剥离将保留数字和下划线
如果要匹配字符,请使用/[A-Za-z]+/
,或POSIX字符类[:alpha:///code>,即/[: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("")
请记住,ruby将下划线\uuuu
视为一个单词字符。因此,如果您还想保留下划线,应该这样做
string.gsub!(/\W+/, '')
否则,您需要执行以下操作:
string.gsub!(/[^a-zA-Z]/, '')
你能稍微描述一点吗,你只想要a-z吗?或者空格和某些符号而不是数字吗?Zsbán和Ævar要求有所不同。希望他们不是这家伙软件的用户。另一方面,你是对的。啊哈,gsub修改了原件!这不酷……这样更好吗?我不想修改orignal.copy=original、 converted=copy.gsub!(/\W+/,'')返回converted@newbie:!
版本修改了原始版本(这就是!
的意思——这是一种“当心,我正在更改你在上面叫我的对象”的标志)。没有!
的版本(如我的第二个代码示例)做您想做的事情——它不在原地修改字符串,而是返回一个应用了替换项的副本
string.gsub!(/[^a-zA-Z]/, '')