包含超过给定长度的非ASCII的Java正则表达式匹配字符串

包含超过给定长度的非ASCII的Java正则表达式匹配字符串,java,regex,Java,Regex,如何使用正则表达式确定字符串是否包含非ASCII字符并超过5个字符 我尝试了这个模式:(?=\p{ASCII})(?=^.{6,}$) 我想(?=)的意思是(?=一定是这个)(?=也是这个) 给定此输入:1巻345 我希望matcherfind()返回false 给定此输入:1巻34567 我希望matcherfind()返回true 但它总是在两个输入上都返回false 还请解释为什么我给出的模式不起作用 更新: 我找到了正确的模式:(\P{ASCII})(.{6,}) 现在我只需要知道为什么

如何使用正则表达式确定字符串是否包含非ASCII字符并超过5个字符

我尝试了这个模式:
(?=\p{ASCII})(?=^.{6,}$)
我想
(?=)
的意思是(?=一定是这个)(?=也是这个)

给定此输入:
1巻345
我希望matcher
find()
返回false

给定此输入:
1巻34567
我希望matcher
find()
返回true

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

还请解释为什么我给出的模式不起作用

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


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

您要找的是:

^(?=.*\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,}$)

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


    请注意,
    与换行符不匹配。因此,您可能希望通过使用
    (?s)

    (?s)^(?=.*\P{ASCII})来设置
    s
    修饰符。{6,}$

    您要查找的是:

    ^(?=.*\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,}$)

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


    请注意,
    与换行符不匹配。因此,您可能希望通过使用
    (?s)

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

    设置
    s
    修饰符,如果我只使用
    (?=\P{ASCII})
    ,则返回true,但如果我同时使用
    (?=\P{ASCII})(?=.{6,}$)/code>,则返回错误说明原因?我认为您的陈述可能不正确。->“您告诉正则表达式引擎第一个字符是否为非ascii字符,这是错误的,因为第一个字符为1。请重试。”巻345671作为输入,它应该输出true。“因为
    (?=\P{ASCII})
    返回true,只要字符串包含非ASCII,无论它位于何处。我不确定你的观点是否正确。@supertonsky如果你只使用
    (?=\P{ASCII})
    ,那么你不能断言它位于字符串的开头,因为没有
    ^
    。尝试使用
    (?=^\P{ASCII})
    (?=\P{ASCII})(?=^)
    ,它应该返回false。我想我开始明白你的意思了。您的意思是说
    (?=^)
    影响对字符串应用
    (?=\P{ASCII})
    以查找匹配项的方式?我认为它们在某种程度上是完全独立的:1)检查是否有非亚洲字符2)检查长度是否在规定的范围内,而不考虑或不考虑前面的条件。还是这个假设错了?@supertonsky你能加入吗?详细解释这一点需要相当长的时间。我现在也很忙。如果我只使用
    (?=\P{ASCII})
    ,那么它会返回true,但是如果我同时使用
    (?=\P{ASCII})(?=^.{6,}$)
    ,那么它会返回假注意来解释为什么?我认为你的陈述可能不正确。->“您告诉正则表达式引擎第一个字符是否为非ascii字符,这是错误的,因为第一个字符为1。请重试。”巻345671作为输入,它应该输出true。“因为
    (?=\P{ASCII})
    返回true,只要字符串包含非ASCII,无论它位于何处。我不确定你的观点是否正确。@supertonsky如果你只使用
    (?=\P{ASCII})
    ,那么你不能断言它位于字符串的开头,因为没有
    ^
    。尝试使用
    (?=^\P{ASCII})
    (?=\P{ASCII})(?=^)
    ,它应该返回false。我想我开始明白你的意思了。您的意思是说
    (?=^)
    影响对字符串应用
    (?=\P{ASCII})
    以查找匹配项的方式?我认为它们在某种程度上是完全独立的:1)检查是否有非亚洲字符2)检查长度是否在规定的范围内,而不考虑或不考虑前面的条件。还是这个假设错了?@supertonsky你能加入吗?详细解释这一点需要相当长的时间。我现在也很忙。