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