Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模式和匹配器在java中不起作用_Java_Regex - Fatal编程技术网

模式和匹配器在java中不起作用

模式和匹配器在java中不起作用,java,regex,Java,Regex,基本上,我有一个简单的字符串,其中需要显式限制a-zA-Z0-9以外的字符。在我提到问题之前,这里是我如何做的 Pattern p = Pattern.compile("[&=]"); Matcher m = p.matcher("Nothing is wrong"); if (m.find()){ out.print("You are not allowed to have &=."); return; } Pattern p1 = Pattern.compi

基本上,我有一个简单的字符串,其中需要显式限制
a-zA-Z0-9
以外的字符。在我提到问题之前,这里是我如何做的

Pattern p = Pattern.compile("[&=]");
Matcher m = p.matcher("Nothing is wrong");
if (m.find()){
    out.print("You are not allowed to have &=.");
    return;
}

Pattern p1 = Pattern.compile("[a-zA-Z0-9]");
Matcher m1 = p1.matcher("Itissupposetobeworking");
if (m1.find()){
    out.print("There is something wrong.");
    return;
}
第一个匹配器工作正常,但在第二个匹配器
m1
上,总是执行
if(m1.find())
,即使它不包含模式中指定以外的任何字符

我还尝试了
Pattern p1=Pattern.compile(“[ABCDEFGHIJKLMNOPQRSTUVWXYZABCDFGHIJKLMNOPQRSTUVWXYZ0123456789]”)
,但仍然有同样的问题

如果您想知道,
String.matches([“a-zA-Z0-9”])之间哪个更好还是我在上面使用的方式


提前感谢。

[a-zA-Z0-9]
尝试匹配字母数字字符

因此,如果在
matcher()
的输入字符序列中有一个字母数字字符,您将得到要打印的“有问题”

将其更改为
[^a-zA-Z0-9]
,然后重试


这将尝试匹配非字母数字字符。因此,您将获得预期的结果。

[a-zA-Z0-9]
尝试匹配字母数字字符

因此,如果在
matcher()
的输入字符序列中有一个字母数字字符,您将得到要打印的“有问题”

将其更改为
[^a-zA-Z0-9]
,然后重试


这将尝试匹配非字母数字字符。因此,您将得到预期的结果。

您似乎希望在包含字母数字字符以外的字符的字符串中找到部分匹配:

Pattern p1 = Pattern.compile("[^a-zA-Z0-9]");

[^a-zA-Z0-9]
模式是一个否定字符类,它与类中定义的字符以外的任何字符相匹配。因此,如果字符串包含ASCII字母或数字以外的任何字符,将触发
if(m1.find())
,并显示消息


请注意,可以使用预定义的字符类
\p{Alnum}
替换整个被否定的字符类,该字符类匹配字母数字以外的任何字符
\p{Alnum}
匹配任何字母数字字符,
\p{Alnum}
是反向类。

您似乎希望在包含字母数字字符以外的字符的字符串中找到部分匹配:

Pattern p1 = Pattern.compile("[^a-zA-Z0-9]");

[^a-zA-Z0-9]
模式是一个否定字符类,它与类中定义的字符以外的任何字符相匹配。因此,如果字符串包含ASCII字母或数字以外的任何字符,将触发
if(m1.find())
,并显示消息


请注意,可以使用预定义的字符类
\p{Alnum}
替换整个被否定的字符类,该字符类匹配字母数字以外的任何字符
\p{Alnum}
匹配任何字母数字字符,
\p{Alnum}
是反向类。

如果使用org.apache.commons.lang.StringUtils的isAlphanumeric方法,您的代码将变得更可读。所以你需要写作

if (!StringUtils.isAlphanumeric("Itissupposetobeworking"))
而不是

Pattern p1 = Pattern.compile("[a-zA-Z0-9]");
Matcher m1 = p1.matcher("Itissupposetobeworking");
if (!m1.find()){

如果使用org.apache.commons.lang.StringUtils的isAlphanumeric方法,代码的可读性就会大大提高。所以你需要写作

if (!StringUtils.isAlphanumeric("Itissupposetobeworking"))
而不是

Pattern p1 = Pattern.compile("[a-zA-Z0-9]");
Matcher m1 = p1.matcher("Itissupposetobeworking");
if (!m1.find()){

当上面的表达式找到匹配项时,它会打印“有问题”。但如果您想限制,请使用下面的代码

    Pattern p1 = Pattern.compile("a-zA-Z0-9");
    String a = "It$issupposetobeworking";
    Matcher m1 = p1.matcher(a);
    if (m1.find()){
        System.out.print("There is something wrong.");
    }
    else
    {
        System.out.println("Everything is fine");
    }
如果希望相同的代码在该场景中使用相同的正则表达式,请使用此代码

    Pattern p1 = Pattern.compile("[a-zA-Z0-9]");
    Matcher m1 = p1.matcher("Itissupposetobeworking");
    if (!(m1.find())){
           out.print("There is something wrong.");
            return;
     }

当上面的表达式找到匹配项时,它会打印“有问题”。但如果您想限制,请使用下面的代码

    Pattern p1 = Pattern.compile("a-zA-Z0-9");
    String a = "It$issupposetobeworking";
    Matcher m1 = p1.matcher(a);
    if (m1.find()){
        System.out.print("There is something wrong.");
    }
    else
    {
        System.out.println("Everything is fine");
    }
如果希望相同的代码在该场景中使用相同的正则表达式,请使用此代码

    Pattern p1 = Pattern.compile("[a-zA-Z0-9]");
    Matcher m1 = p1.matcher("Itissupposetobeworking");
    if (!(m1.find())){
           out.print("There is something wrong.");
            return;
     }

“[a-zA-Z0-9]”
匹配(找到部分匹配)在
中,因此
存在错误。
消息应打印出来。你期待什么?顺便说一句,glee8e建议使用
if(!m1.find()){
。我希望它不会打印出来,因为我匹配的字符串不包含任何不允许的字符,例如
!@$%&*(
或诸如此类…那么您似乎需要
模式p1=Pattern.compile([^a-zA-Z0-9]);
,对吗?或者您仍然可以“否定”
查找()
正如glee8e建议的那样。@WiktorStribiżew Thank bro的工作方式正是我所期望的
“[a-zA-Z0-9]”“
匹配(找到部分匹配)在
中的工作方式,因此
有问题。
消息应该打印出来。你期待什么?顺便说一句,glee8e建议使用
如果(!m1.find()){
。我希望它不会打印出来,因为我匹配的字符串不包含任何不允许的字符,例如
!@$%&*(
或诸如此类……那么您似乎需要
模式p1=Pattern.compile([^a-zA-Z0-9]”;
,对吗?或者您仍然可以“否定”
查找()
正如glee8e所建议的那样。@WiktorStribiżew感谢bro以我预期的完美方式工作