我认为[[: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
Run Code Online (Sandbox Code Playgroud)
如何编写匹配所有这些空格的正则表达式?
不幸的是,两个零宽度空间都不被认为是空格,而是"其他:格式"字符.
这符合规范,CtrlF因为200B它标题为"格式字符."因为你想匹配ZWSP,我没有看到任何理由不匹配所有的格式字符,可以做什么:
/\p{Zs}|\p{Cf}/ =~ 65279.chr('UTF-8')
#? 0
Run Code Online (Sandbox Code Playgroud)
还请注意,在处理Unicode时,任何明确的字符枚举都是一个非常糟糕的主意.规范经常变化,明确的字符列表将在明天早上在这种情况下变得过时.
有两种一般方法可以解决这个问题:
[[:space:]]或\p{Zs}.)