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

3

我有一个表单,想要将数据提交到数据库。这些数据是UTF8编码的。我遇到了匹配换行符的问题。我使用的模式类似于:

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

这个模式在用户在文本框中输入换行符之前是有效的。我尝试在类内使用\p{Z},但没有成功。我还尝试过“s”,但也不起作用。

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

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的支持)。那就是在支持Unicode的正则表达式中\w的作用(Java不支持)。

在较旧版本的Perl中,你可能会将换行写成

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

尽管现在更好的写法是:
 (?:(?>\r\n)|\v)

这正是

 \R

匹配。

Java 在这些方面非常笨拙。你必须写成

<br>

来表示换行。

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

当然,如果要将其作为字符串写入,则需要额外的反斜杠。

对于14个常见字符类正则表达式转义字符的其他Java等价物,使它们与Unicode配合使用,我在这个答案中提供。您可能需要在其他不足以识别Unicode的类似Java的正则表达式语言中使用它们。


感谢您的回答。这是针对“评论”表单的。用户在那里编写他们的评论并将其存储到数据库中。问题在于,当我尝试使用“回车”来换行时,正则表达式无法匹配。但现在它可以了! :) - Booya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接