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_String - Fatal编程技术网

如何在Java中使用正则表达式有效地从给定字符串中提取不匹配的字符

如何在Java中使用正则表达式有效地从给定字符串中提取不匹配的字符,java,regex,string,Java,Regex,String,我有一个要求,即我应该验证给定字符串,并且我应该从该字符串中提取任何不匹配的字符(如果存在) 如果字符串具有任意组合和任意序列,则认为该字符串有效 a-z a-z 0-9-/?:(),'+CR-LF空格 我使用正则表达式来进行验证 ^[a-zA-Z0-9/?:(),'+\r\n-] public class RegEx { public static void main(String[] args) { String textToValidate="(+aBcD23456

我有一个要求,即我应该验证给定字符串,并且我应该从该字符串中提取任何不匹配的字符(如果存在)

如果字符串具有任意组合和任意序列,则认为该字符串有效

a-z a-z 0-9-/?:(),'+CR-LF空格

我使用正则表达式来进行验证 ^[a-zA-Z0-9/?:(),'+\r\n-]

public class RegEx {
    public static void main(String[] args) {
        String textToValidate="(+aBcD23456 lkmsdklm 1dfr435f:/?,.' \r\n)";
        Set<Character> failedCharacter = getUnMatchedCharacter(textToValidate);
       if(failedCharacter.isEmpty()){
            System.out.println("Valid String");
        }
        else{
            System.out.println("Given String contains invalid characters "+failedCharacter);
        }
    }

    public static Set<Character> getUnMatchedCharacter(String textToValidate){
        Set<Character> failedCharacter = new LinkedHashSet<Character>();
        Pattern regexPattern = Pattern.compile("^[a-zA-Z0-9/?:().,'+\r\n -]");
        char[] charArray = textToValidate.toCharArray();
        for (char character : charArray) {
            Matcher result = regexPattern.matcher(String.valueOf(character));
            if(!result.matches()){
                failedCharacter.add(character);
            }
        }
        return failedCharacter;
    }
}
公共类正则表达式{
公共静态void main(字符串[]args){
字符串textToValidate=“(+aBcD23456 lkmsdklm 1dfr435f:/?,。\r\n)”;
设置failedCharacter=getUnMatchedCharacter(textToValidate);
if(failedCharacter.isEmpty()){
System.out.println(“有效字符串”);
}
否则{
System.out.println(“给定字符串包含无效字符”+failedCharacter);
}
}
公共静态集getUnMatchedCharacter(字符串textToValidate){
Set failedCharacter=new LinkedHashSet();
Pattern regexpatern=Pattern.compile(“^[a-zA-Z0-9/?:(),”+\r\n-]);
char[]charArray=textToValidate.toCharArray();
for(字符:charArray){
匹配器结果=regexpatern.Matcher(String.valueOf(character));
如果(!result.matches()){
失败字符。添加(字符);
}
}
返回失败字符;
}
}
例外输出如下所示

  • 阳性病例
    • 输入:textToValidate=“(+aBcD23456 lkmsdklm 1dfr435f:/?,“\r\n)”
    • 输出:有效字符串
  • 阴性病例
    • 输入:textToValidate=“(+aBcD23456&*^%$#@!lkmsdklm 1dfr435f:/?,。\r\n)”
    • 输出:给定字符串包含无效字符[&、*、^、%、$、#、@、!]
现在的问题是,我觉得上述解决方案(编码)对于给定的需求来说不够有效

我尝试了正则表达式求反,mathcher.find(),mathcher.group(),但没有得到所需的输出


关于如何改进上述代码的任何建议,或者是否有其他方法可以使用Java中的正则表达式从给定字符串中有效提取不匹配的字符

这里有一个简单的函数,可以给出您想要的结果

private String validateString(String s){
        ArrayList invalidChars = new ArrayList();
        char[] ch = s.toCharArray();
        String output = "";
        for(int i = 0; i < s.length(); i++){
            if((Character.isLetter(ch[i]) || Character.isDigit(ch[i]))){
                output += ch[i];
            }else invalidChars.add(ch[i]);
        }
        if(invalidChars.size() > 0) return "Given String contains invalid characters: " + invalidChars.toString();
        else return "Given string is valid: " + output;

    }
私有字符串验证字符串(字符串s){
ArrayList invalidChars=新的ArrayList();
char[]ch=s.toCharArray();
字符串输出=”;
对于(int i=0;i0)返回“给定字符串包含无效字符:”+invalidChars.toString();
否则返回“给定字符串有效:”+输出;
}
使用

validateString(“abc123!#”)

会回来的


“给定字符串包含无效字符:[!,@,#]

添加
+
量词和字符串锚点的结尾
$
。或者使用否定模式来查找是否有不允许的字符。另外,在java字符串模式中,必须使用转义反斜杠。@Casimir et Hipolyte:你能给出一些如何执行的示例吗?我试过使用正则表达式门控模式。但是,不幸的是,它对我没有什么作用。我还使用了^[a-zA-Z0-9/?:(),“+\r\n-]+$”正如您前面提到的,但我没有得到所需的结果output@Soleil,看我的答案,它提供了一个简单的方法来实现你想要的。那么我在帖子-/?:()中提到的特殊角色呢。,“+CR LF空白字符.isleter()&Character.isDigit()将允许来自具有unicode表示形式的其他语言的字符。我的要求是只允许a-zA-Z0-9-/?:(),“+CR LF空格