Java 不匹配的模式正则表达式

Java Pattern REGEX Where Not Matching

我正在尝试使用 Java 模式和匹配器来应用输入检查。我让它以一种非常基本的格式工作,到目前为止我对此很满意。它将 REGEX 应用于参数,然后循环匹配字符。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexUtil {

   public static void main(String[] args) {

      String    argument;
      Pattern   pattern;
      Matcher   matcher;

      argument = "#a1^b2";
      pattern = Pattern.compile("[a-zA-Z]|[0-9]|\s");
      matcher = pattern.matcher(argument);

      // find all matching characters
      while(matcher.find()) {
         System.out.println(matcher.group());
      }

   }

}

这对于提取所有好的字符来说很好,我得到了输出

a
1
b
2

现在我想知道是否可以对任何不匹配 REGEX 的字符执行相同的操作,所以我得到了输出

#
^

或者更好的是遍历它并为参数的每个索引获取 TRUE 或 FALSE 标志

false
true
true
false
true
true

我只知道如何使用 matcher.find() 循环,任何帮助将不胜感激

您必须遍历 String 中的每个 char 并一一检查:

//for-each loop, shorter way
for (char c : argument.toCharArray()){
    System.out.println(pattern.matcher(c + "").matches());
}

//classic for-i loop, with details
for (int i = 0; i < argument.length(); i++) {
    String charAtI = argument.charAt(i) + "";
    boolean doesMatch = pattern.matcher(charAtI).matches();
    System.out.println(doesMatch);
}

另外,当你不需要它时,你可以同时声明并赋值:

String argument = "#a1^b2";
Pattern pattern = Pattern.compile("[a-zA-Z]|[0-9]|\s");

您可以为您的模式添加一个 |(.) 替代项(以匹配除换行符以外的任何字符)并检查第 1 组是否在每次匹配时都匹配。如果是,输出false,否则,输出true:

String argument = "#a1^b2";
Pattern pattern = Pattern.compile("[a-zA-Z]|[0-9]|\s|(.)"); // or "[a-zA-Z0-9\s]|(.)"
Matcher matcher = pattern.matcher(argument);

while(matcher.find()) {                           // find all matching characters
    System.out.println(matcher.group(1) == null);

Java demo,输出:

false
true
true
false
true
true

请注意,您不需要在此处使用 Pattern.DOTALL,因为 "whitelist" 部分模式中的 \s 匹配换行符。

为什么不简单地从您的字符串中删除所有匹配的字符,以便您只返回不匹配的字符:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexUtil {

   public static void main(String[] args) {

      String    argument;
      Pattern   pattern;
      Matcher   matcher;

      argument = "#a1^b2";
      pattern = Pattern.compile("[a-zA-Z]|[0-9]|\s");
      matcher = pattern.matcher(argument);

      // find all matching characters
      while(matcher.find()) {
         System.out.println(matcher.group());
         argument = argument.replace(matcher.group(), "");
      }

      System.out.println("argument: " + argument);

   }

}

跟踪位置,并为每个匹配项打印上一个匹配项和当前匹配项之间的字符。

int pos = 0;
while (matcher.find()) {
    for (int i = pos; i < matcher.start(); i++) {
        System.out.println(argument.charAt(i));
    }
    pos = matcher.end();
}
// Print any trailing characters after last match.
for (int i = pos; i < argument.length(); i++) {
    System.out.println(argument.charAt(i));
}

一个解决方案是

    String  argument;
    Pattern pattern;
    Matcher matcher;

    argument = "#a1^b2";
    List<String> charList = Arrays.asList(argument.split(""));
    pattern = Pattern.compile("[a-zA-Z]|[0-9]|\s");
    matcher = pattern.matcher(argument);
    ArrayList<String> unmatchedCharList = new ArrayList<>();
    // find all matching
    while(matcher.find()) {
        unmatchedCharList.add(matcher.group());
    }
    for(String charr : charList)
    {
        System.out.println(unmatchedCharList.contains(charr ));
    }

输出

错误 真的 真的 错误的 真的 真