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