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

iro*_*and 0 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
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*kin 5

不幸的是,两个零宽度空间都不被认为是空格,而是"其他:格式"字符.

这符合规范,CtrlF因为200B它标题为"格式字符."因为你想匹配ZWSP,我没有看到任何理由不匹配所有的格式字符,可以做什么:

/\p{Zs}|\p{Cf}/ =~ 65279.chr('UTF-8')
#? 0
Run Code Online (Sandbox Code Playgroud)

还请注意,在处理Unicode时,任何明确的字符枚举都是一个非常糟糕的主意.规范经常变化,明确的字符列表将在明天早上在这种情况下变得过时.

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

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