Java 模式 REGEX 不匹配



我正在尝试使用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(( 循环访问,任何帮助将不胜感激

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

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 演示,输出:

false
true
true
false
true
true

请注意,您不需要在此处使用Pattern.DOTALL,因为模式的"白名单"部分中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);
   }
}

您必须遍历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");

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

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 ));
    }

输出

假真真假真真

最新更新