我在用户输入文本中发现了一个空白字符(在数据库和网页中显示为空格),我想将其过滤掉。
我得到的那个角色的unicode代码点是12288
(我认为它是这个角色:codepoints.net/U+12288,我是对的吗?)。
我如何使用Ruby中的RegExp匹配它?
非常感谢你的帮助。
更新
嗨,大家好,非常感谢。我从你的回复中学到了很多东西,但它还没有奏效。我发现用户输入中的字符不是字符codepoints.net/U+12288,但是调用.codepoints
会返回12288
,因此匹配\u12288
无效。那是为什么?
> str = note.public_stripped_content
=> " 权谋术,在古代称之为帝王术..."
> str.encoding
=> #<Encoding:UTF-8>
> str[0].codepoints
=> [12288]
> "\u12288"
=> "ረ8"
> "\u12288"[0]
=> "ረ"
> "\u12288"[1]
=> "8"
> "\u12288"[0].codepoints
=> [4648]
> "\u12288"[1].codepoints
=> [56]
以下是我从Rails控制台完成的工作。 (你可以忽略中文字符,有问题的字符是主要的空白。)
> str = note.public_stripped_content
=> " 权谋术,在古代称之为帝王术..."
> str.encoding
=> #<Encoding:UTF-8>
> str[0].codepoints
=> [12288]
> str.delete("\u12288")
=> " 权谋术,在古代称之为帝王术..."
> str[0].codepoints
=> [12288]
> print /\u12288/.match(str)
=> nil
> str.gsub(/\p{Cuneiform}/u,'')
=> " 权谋术,在古代称之为帝王术..."
答案 0 :(得分:2)
如果它真的以unicode形式出现,你也可以通过匹配它的General Category或Script来做到这一点。
str = "FooBar"
按类别:Regex101 Example
#match by category Other Letter (Lo)
str.gsub(/\p{Lo}/u,'')
按脚本:Regex101 Example
#match by script Cuneiform
str.gsub(/\p{Cuneiform}/u,'')
答案 1 :(得分:1)
我能想到#tr!
:
>> string = "foo\u12288bar"
=> "fooረ8bar"
>> string.tr!("\u12288","")
=> "foobar"
>> string
=> "foobar"
答案 2 :(得分:1)
因为你的int值是12288而且\ u有四个十六进制数字。试试:\ u3000
答案 3 :(得分:1)
codepoints
返回一个整数数组,它们作为十进制值打印。在字符串文字中,必须使用十六进制值按代码点指定字符。您可map
codepoints
这样的结果:
string = "权谋术,在古代称之为帝王术..."
string.codepoints
# => [12288, 12288, 26435, ... ]
string.codepoints.map { |c| c.to_s(16) }
# => ["3000", "3000", "6743", ... ]
您需要的实际代码点是3000.如果您只想删除它,则不需要正则表达式,调用delete
(或delete!
,如果适用)将执行:< / p>
string.delete("\u3000")
# => "权谋术,在古代称之为帝王术..."
更新:要指定长度超过四位(十六进制)的代码点,必须将其包装在大括号中:
"\u12288".codepoints # => [4648, 56]
"\u{12288}".codepoints # => [74376]