Unicode正则表达式匹配换行符?

时间:2010-12-08 14:35:14

标签: regex unicode character-properties line-breaks

我有这个表单,我想将数据提交到数据库。数据是UTF8。我在匹配换行符时遇到问题。我使用的模式是这样的:

~^[\p{L}\p{M}\p{N} ]+$~u

此模式可正常工作,直到用户在其文本框中添加新行。我尝试在课堂上使用\p{Z}但没有成功。我也试过“s”但它没有用。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

Unicode换行符是紧接着换行符的回车符,或者是具有垂直空白属性的任何字符。

但看起来你正试图在那里匹配通用空格。在Java中,那将是

 [\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000]

可以通过使用范围“仅”来缩短它:

 [\u000A-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]

包括水平空格(\h)和垂直空格(\v),它们可能与通用空格(\s)相同或不同。

看起来你也想尝试匹配字母数字。

  • 仅字母表通常是[\pL\pM\p{Nl}]
  • 数字通常不是\pN全部\p{Nd},只是[\p{Nd}\p{Nl}]或有时[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]
  • Identifer字符需要连接符标点符号和更多,所以\w - 如果你的正则表达式引擎支持那些类型的操作(Java的确如此)。这就是 (?:\r\n|\p{VertSpace}) 在支持Unicode的正则表达式语言中的作用(Java不是其中之一)。

在旧版本的Perl中,您可能会将换行符写为

 (?:(?>\r\n)|\v)

虽然现在更好地写为

 \R

这正是

  (?:(?>\u000D\u000A)|[\u000A-\u000D\u0085\u2028\u2029])

匹配

Java在这些方面非常笨拙。在那里你必须写一个换行符

{{1}}

当写成字符串时,当然需要额外的bbaacckkssllasshheess。

14个常见字符类正则表达式的其他Java等价物转义为使用Unicode我给in this answer。您可能必须使用其他类似Java的正则表达式语言,这些语言不能充分识别Unicode。