Java RegEx匹配包含超过给定长度的非ASCII的字符串

时间:2014-03-11 05:50:39

标签: java regex

如何使用RegEx确定字符串是否包含非ASCII且超过5个字符?

我尝试了这种模式:(?=\P{ASCII})(?=^.{6,}$) 我认为(?=)表示(?=必须是这样)(?=也是这样)。

鉴于此输入:1巻345 我期待匹配器find()返回false。

鉴于此输入:1巻34567 我期待匹配器find()返回true。

但它总是在两个输入上都返回false。

请解释为什么我给定的模式不起作用。

更新 我想出了正确的模式:(\P{ASCII})(.{6,})

现在我只需要知道为什么(?=)不起作用。

1 个答案:

答案 0 :(得分:5)

您正在寻找的是:

^(?=.*\P{ASCII}).{6,}$

我们来解释一下:

^                       # Begin of string
    (?=                 # Take a look and make sure if there is
        .*              # Anything zero or more times (greedy)
        \P{ASCII}       # A non-ascii character
    )                   # End of lookahead
    .{6,}               # Match any character 6 or more times
$                       # End of string

让我们分析一下你的模式失败的原因(?=\P{ASCII})(?=^.{6,}$)

  1. (?=\P{ASCII})您首先要告诉正则表达式引擎检查是否存在非ascii字符。
  2. (?=^.{6,}$)然后你告诉正则表达式引擎检查它是否是前瞻中带有^的字符串的开头,然后检查是否有6个或更多字符。
  3. 现在看看你的输入,你有1巻34567。并且你告诉正则表达式引擎,如果第一个字符是非ascii,这是 false ,因为第一个字符是1。尝试巻345671作为输入,它应输出 true

    请注意,.与换行符不匹配。因此,您可能希望使用s(?s)来设置(?s)^(?=.*\P{ASCII}).{6,}$修饰符。