匹配类似空间的字符的最佳方法是什么?

时间:2017-10-17 05:20:56

标签: ruby regex

我认为[[:space:]]匹配所有类似空格的字符,但“零宽度空间”是个例外。

# normal space
32.chr('UTF-8').match?(/[[:space:]]/) #=> true
# no break space
160.chr('UTF-8').match?(/[[:space:]]/) #=> true
# en space 
8194.chr('UTF-8').match?(/[[:space:]]/) #=> true
# em space
8195.chr('UTF-8').match?(/[[:space:]]/) #=> true
# thin space
8201.chr('UTF-8').match?(/[[:space:]]/) #=> true
# ideographic space
12288.chr('UTF-8').match?(/[[:space:]]/) #=> true
# zero width space
8203.chr('UTF-8').match?(/[[:space:]]/) #=> false
# zero width no break space
65279.chr('UTF-8').match?(/[[:space:]]/) #=> false

如何编写匹配所有这些空格的正则表达式?

2 个答案:

答案 0 :(得分:5)

不幸的是,两个零宽度空格不被视为空格,而是“Other:Format”个字符。

对应200B的{​​{3}}, Ctrl F ,它的标题为“格式字符。”因为你想匹配ZWSP,我没有看到任何理由不匹配所有格式字符,可以做什么:

/\p{Zs}|\p{Cf}/ =~ 65279.chr('UTF-8')
#⇒ 0

请注意,在处理Unicode时,任何明确的字符枚举都是非常糟糕的主意。规范经常更改 ,明确的字符列表将在明天早上在此上下文中过时。

有两种一般方法可以解决这个问题:

  • 解析联盟规范(例如the specification这样做是为了确保正确处理最新版本的unicode,)
  • 使用通用“群组”(例如[[:space:]]\p{Zs}。)

答案 1 :(得分:1)

按要求。

从UCD数据库执行Unicode 9查询,这些属性都显示为 为了空间。

运行正则表达式返回28个字符。

如果只运行\s,则会显示29个字符。

但是,如果你把它们组合起来,就会有32个字符 我假设是完整的空白集。

[\x{9}-\x{D}\x{1C}-\x{20}\x{85}\x{A0}\x{1680}\x{2000}-\x{200‌​B}\x{200E}-\x{200F}\‌​x{2028}-\x{2029}\x{2‌​02F}\x{205F}\x{3000}‌​]

[\s\p{White_Space}\p{Pattern_White_Space}\p{Bidi_Class=White‌​_Space}\p{General_Ca‌​tegory=Space_Separat‌​or}\p{Line_Break=Spa‌​ce}\p{Line_Break=ZWS‌​pace}]

参考文献:

http://www.regexformat.com/scrn8/UCDusage.htm
http://www.regexformat.com/scrn8/Uusage.jpg

这是完整的清单

000009    <control-0009>
00000A    <control-000A>
00000B    <control-000B>
00000C    <control-000C>
00000D    <control-000D>
00001C    <control-001C>
00001D    <control-001D>
00001E    <control-001E>
00001F    <control-001F>
000020    SPACE
000085    <control-0085>
0000A0    NO-BREAK SPACE
001680    OGHAM SPACE MARK
002000    EN QUAD
002001    EM QUAD
002002    EN SPACE
002003    EM SPACE
002004    THREE-PER-EM SPACE
002005    FOUR-PER-EM SPACE
002006    SIX-PER-EM SPACE
002007    FIGURE SPACE
002008    PUNCTUATION SPACE
002009    THIN SPACE
00200A    HAIR SPACE
00200B    ZERO WIDTH SPACE
00200E    LEFT-TO-RIGHT MARK
00200F    RIGHT-TO-LEFT MARK
002028    LINE SEPARATOR
002029    PARAGRAPH SEPARATOR
00202F    NARROW NO-BREAK SPACE
00205F    MEDIUM MATHEMATICAL SPACE
003000    IDEOGRAPHIC SPACE