如何使用正则表达式匹配 unicode 字符代码点 12288
How to match unicode character code point 12288 using regexp
我在用户输入文本中发现了一个空白字符(在数据库和网页中显示为空白 space),我想将其过滤掉。
我得到的那个字符的 unicode 代码点是 12288
(我认为是这个字符:codepoints.net/U+12288,对吗?)。
如何在 Ruby 中使用 RegExp 匹配它?
非常感谢您的帮助。
更新:
大家好,非常感谢。我真的从你的回复中学到了很多东西,但它仍然不起作用。
我发现我的用户输入的字符不是字符 codepoints.net/U+12288,而是调用 .codepoints
它 returns 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,'')
=> " 权谋术,在古代称之为帝王术..."
我能想到#tr!
:
>> string = "foo\u12288bar"
=> "fooረ8bar"
>> string.tr!("\u12288","")
=> "foobar"
>> string
=> "foobar"
如果它确实以 unicode 形式出现,您也可以通过匹配它的一般类别或脚本来做到这一点。
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,'')
因为您的 int 值为 12288 并且 \u 取四位十六进制数字。尝试:\u3000
codepoints
returns 一个整数数组,作为十进制值打印结束。在字符串文字中,您必须使用十六进制值按代码点指定字符。您可以 map
像这样 codepoints
的结果:
string = "权谋术,在古代称之为帝王术..."
string.codepoints
# => [12288, 12288, 26435, ... ]
string.codepoints.map { |c| c.to_s(16) }
# => ["3000", "3000", "6743", ... ]
您需要的实际代码点是 3000。如果您只想删除它,则不需要正则表达式,调用 delete
(或 delete!
,如果适用)即可:
string.delete("\u3000")
# => "权谋术,在古代称之为帝王术..."
更新:要指定长度超过四位(十六进制)的代码点,您必须将其括在大括号中:
"\u12288".codepoints # => [4648, 56]
"\u{12288}".codepoints # => [74376]
我在用户输入文本中发现了一个空白字符(在数据库和网页中显示为空白 space),我想将其过滤掉。
我得到的那个字符的 unicode 代码点是 12288
(我认为是这个字符:codepoints.net/U+12288,对吗?)。
如何在 Ruby 中使用 RegExp 匹配它?
非常感谢您的帮助。
更新:
大家好,非常感谢。我真的从你的回复中学到了很多东西,但它仍然不起作用。
我发现我的用户输入的字符不是字符 codepoints.net/U+12288,而是调用 .codepoints
它 returns 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,'')
=> " 权谋术,在古代称之为帝王术..."
我能想到#tr!
:
>> string = "foo\u12288bar"
=> "fooረ8bar"
>> string.tr!("\u12288","")
=> "foobar"
>> string
=> "foobar"
如果它确实以 unicode 形式出现,您也可以通过匹配它的一般类别或脚本来做到这一点。
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,'')
因为您的 int 值为 12288 并且 \u 取四位十六进制数字。尝试:\u3000
codepoints
returns 一个整数数组,作为十进制值打印结束。在字符串文字中,您必须使用十六进制值按代码点指定字符。您可以 map
像这样 codepoints
的结果:
string = "权谋术,在古代称之为帝王术..."
string.codepoints
# => [12288, 12288, 26435, ... ]
string.codepoints.map { |c| c.to_s(16) }
# => ["3000", "3000", "6743", ... ]
您需要的实际代码点是 3000。如果您只想删除它,则不需要正则表达式,调用 delete
(或 delete!
,如果适用)即可:
string.delete("\u3000")
# => "权谋术,在古代称之为帝王术..."
更新:要指定长度超过四位(十六进制)的代码点,您必须将其括在大括号中:
"\u12288".codepoints # => [4648, 56]
"\u{12288}".codepoints # => [74376]