我正在尝试使用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 ));
}
输出
假真真假真真