如何使用正则表达式匹配 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]