2

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

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

这种模式可以正常工作,直到用户在他的文本框中添加一个新行。我曾尝试\p{Z}在课堂内使用,但没有成功。我也试过“s”,但没有用。

任何帮助深表感谢。谢谢!

4

1 回答 1

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}]]- 如果您的正则表达式引擎支持这些类型的操作(Java 支持)。这就是\wUnicode 感知的正则表达式语言(Java 不是其中之一)的结果。

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

 (?:\r\n|\p{VertSpace})

虽然现在最好写成

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

这正是

 \R

火柴。

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

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

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

14 个常见字符类正则表达式的其他 Java 等效项转义,以便它们与我在这个答案中给出的 Unicode 一起工作。您可能必须在其他类似 Java 的正则表达式语言中使用它们,这些语言对 Unicode 的感知能力不够。

于 2010-12-08T15:28:03.700 回答