如何使用regexp匹配unicode字符代码点12288

时间:2015-01-22 16:12:34

标签: ruby regex unicode

我在用户输入文本中发现了一个空白字符(在数据库和网页中显示为空格),我想将其过滤掉。

我得到的那个角色的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,'')
=> "  权谋术,在古代称之为帝王术..."

4 个答案:

答案 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]