首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用regexp匹配unicode字符代码点12288

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

Stack Overflow用户
提问于 2015-01-22 16:12:33
回答 4查看 1.7K关注 0票数 1

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

我得到的这个字符的unicode代码点是12288 (我认为是这个字符:编解码器.NET/U+12288,对吗?)

我如何在Ruby中使用RegExp来匹配它呢?

非常感谢你的帮助。

更新:

嗨,伙计们,非常感谢。我从你的回复中学到了很多,但还是没有用。

我发现我的用户输入中的字符不是字符编解码器.NET/U+12288,而是调用.codepoints返回12288,因此匹配的\u12288无法工作。为什么会这样呢?

代码语言:javascript
复制
> 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控制台中所做的工作。(你可以忽略汉字,有问题的字符是前面的空格。)

代码语言:javascript
复制
> 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,'')
=> "  权谋术,在古代称之为帝王术..."
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-23 08:54:29

codepoints返回一个整数数组,这些整数作为十进制值进行打印。在字符串文本中,必须使用十六进制值按代码点指定字符。您可以这样map codepoints的结果:

代码语言:javascript
复制
string = "权谋术,在古代称之为帝王术..."
string.codepoints 
# =>  [12288, 12288, 26435, ... ]
string.codepoints.map { |c| c.to_s(16) }
# => ["3000", "3000", "6743", ... ]

您需要的实际代码点是3000。如果只想删除它,则不需要regexp,调用delete (或delete!,如果适当的话)即可:

代码语言:javascript
复制
string.delete("\u3000")
# => "权谋术,在古代称之为帝王术..."

Update:要指定长度超过4位(十六进制)的代码点,必须用大括号包装:

代码语言:javascript
复制
"\u12288".codepoints # => [4648, 56]
"\u{12288}".codepoints # => [74376]
票数 1
EN

Stack Overflow用户

发布于 2015-01-22 16:42:46

您也可以通过匹配它的通用类别或脚本来实现这一点,如果它是真正的unicode的话。

代码语言:javascript
复制
str = "FooBar"

按类别Regex101实例

代码语言:javascript
复制
#match by category Other Letter (Lo)
str.gsub(/\p{Lo}/u,'')

By ScriptRegex101实例

代码语言:javascript
复制
#match by script Cuneiform
str.gsub(/\p{Cuneiform}/u,'')
票数 2
EN

Stack Overflow用户

发布于 2015-01-22 16:28:22

我可以想到#tr!

代码语言:javascript
复制
>> string = "foo\u12288bar"
=> "fooረ8bar"
>> string.tr!("\u12288","")
=> "foobar"
>> string
=> "foobar"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28093494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档