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}
200B
,它的标题为“格式字符”。由于您希望匹配ZWSP,我看不出有任何理由不匹配所有格式字符,可以使用:
/\p{Zs}|\p{Cf}/ =~ 65279.chr('UTF-8')
#⇒ 0
还请注意,在处理Unicode时,任何字符的显式枚举都是一个非常糟糕的主意。规范经常更改,在这种情况下,显式字符列表将变得过时,就像明天早上一样
处理这一问题有两种一般方法:
- 解析联合体规范(例如,这样做是为了确保正确处理最新版本的unicode,)
- 使用通用的“组”(例如
或[[:space:]
)\p{Zs}
为了空间 运行正则表达式返回28个字符 如果只运行一个
\s
,将显示29个字符
但是,如果将它们组合在一起,则会产生32个字符。我假设这是一整套空白
[\x{9}-\x{D}\x{1C}-\x{20}\x{85}\x{A0}\x{1680}\x{2000}-\x{200B} \x{200E}-\x{200F}\x{2028}-\x{2029}\x{202F}\x{205F}\x{3000}]代码>
或
[\s\p{White\u Space}\p{Pattern\u White\u Space}\p{Bidi\u Class=White_空格}\p{General\u Category=空间或}\p{Line_Break=Space}\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{200B} \x{200E}-\x{200F}\x{2028}-\x{2029}\x{202F}\x{205F}\x{3000}]代码>
或
[\s\p{White\u Space}\p{Pattern\u White\u Space}\p{Bidi\u Class=White_空格}\p{General\u Category=空间或}\p{Line_Break=Space}\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代替