如何使用RegEx确定字符串是否包含非ASCII且超过5个字符?
我尝试了这种模式:(?=\P{ASCII})(?=^.{6,}$)
我认为(?=)
表示(?=必须是这样)(?=也是这样)。
鉴于此输入:1巻345
我期待匹配器find()
返回false。
鉴于此输入:1巻34567
我期待匹配器find()
返回true。
但它总是在两个输入上都返回false。
请解释为什么我给定的模式不起作用。
更新
我想出了正确的模式:(\P{ASCII})(.{6,})
现在我只需要知道为什么(?=)
不起作用。
答案 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,}$)
:
(?=\P{ASCII})
您首先要告诉正则表达式引擎检查是否存在非ascii字符。(?=^.{6,}$)
然后你告诉正则表达式引擎检查它是否是前瞻中带有^
的字符串的开头,然后检查是否有6个或更多字符。现在看看你的输入,你有1巻34567
。并且你告诉正则表达式引擎,如果第一个字符是非ascii,这是 false ,因为第一个字符是1
。尝试巻345671
作为输入,它应输出 true 。
请注意,.
与换行符不匹配。因此,您可能希望使用s
:(?s)
来设置(?s)^(?=.*\P{ASCII}).{6,}$
修饰符。