Ruby 什么是最好的方式来匹配空间,如字符?

Ruby 什么是最好的方式来匹配空间,如字符?,ruby,regex,elixir,Ruby,Regex,Elixir,我认为[[: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

我认为
[[: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

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

不幸的是,两个零宽度空格都不被视为空格,而是字符

与之相对应的是,CtrlF for
200B
,它的标题为“格式字符”。由于您希望匹配ZWSP,我看不出有任何理由不匹配所有格式字符,可以使用:

/\p{Zs}|\p{Cf}/ =~ 65279.chr('UTF-8')
#⇒ 0
还请注意,在处理Unicode时,任何字符的显式枚举都是一个非常糟糕的主意。规范经常更改,在这种情况下,显式字符列表将变得过时,就像明天早上一样

处理这一问题有两种一般方法:

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

不幸的是,两个零宽度的空格都不被视为空格,而是字符

与之相对应的是,CtrlF for
200B
,它的标题为“格式字符”。由于您希望匹配ZWSP,我看不出有任何理由不匹配所有格式字符,可以使用:

/\p{Zs}|\p{Cf}/ =~ 65279.chr('UTF-8')
#⇒ 0
还请注意,在处理Unicode时,任何字符的显式枚举都是一个非常糟糕的主意。规范经常更改,在这种情况下,显式字符列表将变得过时,就像明天早上一样

处理这一问题有两种一般方法:

  • 解析联合体规范(例如,这样做是为了确保正确处理最新版本的unicode,)
  • 使用通用的“组”(例如
    [[:space:]
    \p{Zs}
每个请求

从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\u Space}\p{Pattern\u White\u Space}\p{Bidi\u Class=White‌​_空格}\p{General\u Ca‌​tegory=空间‌​或}\p{Line_Break=Spa‌​ce}\p{Line_Break=ZWS‌​速度}]

参考资料:


这是完整的清单

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
000009
00000A
00000B
00000C
00000D
00001C
00001D
00001E
00001F
000020空间
000085
0000A0不间断空间
001680奥格姆空间标记
002000平方英尺
002001 EM四元
00200EN空间
002003 EM空间
002004每EM空间三次
002005每EM空间四次
002006每EM空间六个
002007图形空间
002008标点空间
002009薄空间
00200A头发空间
00200B零宽度空间
00200E从左到右标记
00200F从右向左标记
002028线分离器
002029段落分隔符
00202F窄不间断空间
00205F介质数学空间
003000表意空间
每个请求

从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\u Space}\p{Pattern\u White\u Space}\p{Bidi\u Class=White‌​_空格}\p{General\u Ca‌​tegory=空间‌​或}\p{Line_Break=Spa‌​ce}\p{Line_Break=ZWS‌​速度}]

参考资料:


这是完整的清单

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
000009
00000A
00000B
00000C
00000D
00001C
00001D
00001E
00001F
000020空间
000085
0000A0不间断空间
001680奥格姆空间标记
002000平方英尺
002001 EM四元
00200EN空间
002003 EM空间
002004每EM空间三次
002005每EM空间四次
002006每EM空间六个
002007图形空间
002008标点空间
002009薄空间
00200A头发空间
00200B零宽度空间
00200E从左到右标记
00200F从右向左标记
002028线分离器
002029段落分隔符
00202F窄不间断空间
00205F介质数学空间
003000表意空间

任何空白字符的
\s
效果如何?快速的谷歌搜索听起来像是
\s
不会匹配零宽度空间。其他建议是只使用十六进制字符200B
\p{Line\U Break=ZWSpace}=U+200B零宽度空间
这是Unicode
[\x{9}-\x{D}\x规定的所有空间{1}{{1}{{1}{{1}{{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{{1}{1}{1}{1}{1}{1}{1}{1}{1}{1{1}{1}{1}{1}{2000}{2000}{2000}{2000}{1}{2000}{1}{1}{1}{2000}{2000}{1}{0}{2000}{2000}{1}{1}{1}{1}{1}{1}{1}{1}{1}{0 0 0 0 0}{1}{1}{1}{1}{0 0 0 Category=Space\u Separator}\p{Line\u Break=Space}\p{Line\u Break=ZWSpace}]
@GaborLengyel在处理Unicode时,任何字符的显式枚举都是一个非常糟糕的主意。规范经常变化,显式字符列表在这种情况下会像明天早上一样变得过时。对于任何空白字符,如何使用
\s
呢?快速的谷歌搜索听起来像
\s
t匹配零宽度的空格。其他建议是用十六进制字符200B
\p{lineu_Break=Z代替