【问题标题】:Regex accept Unicode only正则表达式仅接受 Unicode
【发布时间】:2015-03-12 17:56:20
【问题描述】:

大家好,我需要制作一个符合以下要求的正则表达式:

字母数字 可以包含任何有效的 Unicode 字符,包括空格或标点符号,但我们不应允许前导或尾随空格。

^[\\p{S}\\p{L}\\d\\p{P}][\\p{L}\\d\\p{P} ]{4,18}[\\p{L}\\d\\p{P}]$

现在我正在使用这个,但对于某些 unicode 字符无法正常工作,例如:§

我不是正则表达式的专家,所以我寻求帮助,谢谢。

【问题讨论】:

  • 您需要定义“任何有效的 Unicode 字符”。您是否希望避免使用 Unicode 非字符代码点?您是否试图避免孤儿代理人?或者“任何”是否真的意味着属于您未指定的几个特定字符类别之一的字符?
  • 任何有效的 unicode 字符表示 unicode 表中的每个字符。
  • 重点是 Java Strings 已经包含以 UTF-16 编码的 Unicode 文本。不在 Unicode 代理代码点范围内的 Java chars 都是有效的 Unicode 字符。代理对也对应于 Unicode 代码点,尽管此类代码点的大空间没有分配给它们的字符。
  • 没有单一的 Unicode 表。那么你的意思是Unicode映射一个字符的代码点吗?您的意思是包括明确指定不对应于任何字符的列表代码点?您是否需要考虑 BMP 之外的字符,这些字符将在 Java 中表示为代理对?
  • 当你说前导和尾随空格不能出现时,看起来你可能意味着 Unicode 认为空格的字符,而不是文字空格字符,或者 Java 考虑空格。那么它是什么?

标签: java regex unicode


【解决方案1】:

由于您绝对允许除了尾随或前导空格之外的所有内容,那么也许您不需要正则表达式:

boolean valid = !string.startsWith(" ") && !string.endsWith(" ");

如果您的意思是尾随或前导空格,请尝试:

boolean valid = string.trim().equals(string);

【讨论】:

    【解决方案2】:

    这个正则表达式...

    ^(?:[^\p{Z}\p{Cc}](?:.*[^\p{Z}\p{Cc}]))$
    

    ... 匹配 Java Strings,既不以 Unicode 类别 Z(间距字符)或 Cc(控制字符)中的字符开始也不以字符结束。它将匹配空字符串;如果不应该这样做,可以稍微简化一下。它将接受未配对的代理,但如果需要,它们可以通过更复杂的正则表达式排除。它将接受未映射的 BMP 代码点和对应于未映射的补充代码点的代理对,我认为一般不能排除这些。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      相关资源
      最近更新 更多