【问题标题】:Regular expression to match any vertical whitespace匹配任何垂直空格的正则表达式
【发布时间】:2015-02-26 13:32:39
【问题描述】:

.NET 是否有一个正则表达式模式可以匹配任何会导致多行的字符,即任何垂直空白字符,就像 perl 正则表达式对\v 所做的那样?换句话说,有没有办法匹配\r(回车)、\n(换行)、\v(垂直制表符)和@​​987654330@(换页)以及Unicode字符@987654331 @(下一行)、U+2028(行分隔符)和U+2029(段落分隔符)以及我不知道的任何其他字符可能会导致多行?

我正在.NET 中编写一些验证代码,如果用户提供的输入文本包含多于一行,它将失败。在大多数情况下,这意味着我只需要检查\r\n。但是,我知道还有很多其他垂直的whitespace characters

我知道.NET regex differs from perl regex,最重要的是,.NET 中的\v 匹配“垂直选项卡”,而它匹配 perl 正则表达式中的“垂直空白”。

【问题讨论】:

  • re 类上的 perl docs 声称 perl 正则表达式引擎在 \v 上的行为符合预期(我没有根据经验进行检查)。
  • 您使用的是什么正则表达式方言?您的编程语言(和版本)是什么? perl 的\v 对你有用吗? (有关该类别的字符列表,请参阅stackoverflow.com/questions/12290224/…。)
  • 根据Unicode character property for whitespace cited on Wikipedia,@ChristopherCreutzig 评论中链接后面的列表是详尽的(\x0a-\x0d,\x85,u+2028,u+2029)。
  • 您可以在 Perl 中使用 \R 代表通用换行符。

标签: .net regex perl whitespace multiline


【解决方案1】:

正如你所说,Perl 字符类 \v 匹配 [\x0A-\x0D](换行、垂直制表符、换页和回车(尽管我认为 CR 是垂直空格))除了非 ASCII代码点[\x{2028}\x{2029}](行分隔符和段落分隔符)。

您可以像这样在 .NET 中手动构建这个字符类

[\u0A-\u0D\u2028\u2029]

【讨论】:

  • @roryap:我很乐意提供帮助。我通过将最后一段移到开头来修改您的问题。我认为它仍然很好读。似乎没有读到最后的人走错了方向。
  • @roryap:你可能认为写成[\r\v\f\n\u2028\u2029] 更易读。我不认为有一种方法可以使用 Unicode 名称将字符添加到 .NET 字符串中,这本来是理想的。
  • 再次感谢。太糟糕了 .NET 没有像 perl 那样使用 \v 用于垂直空格的单个字符转义,但是,正如您指出的那样,这仅适用于 ASCII 并且不包括两个额外的 Unicode 字符 \u2028u2029 .
  • @roryap:你误解了我的意思:这六个代码点是 Perl 的 \v 字符类匹配的。字面意义上的 Perl 等价物是 [\r\N{VERTICAL TABULATION}\f\n\N{LINE SEPARATOR}\N{PARAGRAPH SEPARATOR}]。这不是垂直空白字符的明确列表,如果您发现其他引起问题的字符,您可能需要添加到其中。
  • 啊,那我看错了。您说“正如您所说,Perl 字符类 \v 匹配 [\x0A-\x0D]”,我将其解释为详尽无遗,但您随后说“如果您也对非 ASCII 代码点感兴趣 那么它包括 [\x{2028}\x{2029}]"
【解决方案2】:

如果想要匹配任何未知数,只需使用 not[^ ](至少在 .Net 中,我的 perl 有点模糊)来匹配特定字符。例如,如果我想匹配从一行中的当前位置到以字母 D 开头的下一行之间的空格,我会使用这个

([^D]+)

所以匹配捕获将包括直到字母 D 为止的所有类型的空白。

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多