Java 如何从正则表达式中删除此字符?

Java 如何从正则表达式中删除此字符?,java,regex,Java,Regex,我很客气地使用了来自的公认答案-正则表达式在这样实现时似乎能够正确地检查非法字符: public static boolean checkInvalidCharacter (String alphaNum) { if (alphaNum == null) return false; try { boolean isRegex = false; RE r = new RE("^.*?(?=[\\^#%&$\\*:<>\\?

我很客气地使用了来自的公认答案-正则表达式在这样实现时似乎能够正确地检查非法字符:

public static boolean checkInvalidCharacter (String alphaNum) 
  {
    if (alphaNum == null) return false;

    try {
        boolean isRegex = false;
        RE r = new RE("^.*?(?=[\\^#%&$\\*:<>\\?/\\{\\|\\}]).*$");
        isRegex = r.match(alphaNum);
        System.out.println("isRegex: "+isRegex);
        System.out.println("Space");
      return r.match(alphaNum);   
    } catch (RESyntaxException e) {
      return false;
    }
  }
公共静态布尔checkInvalidCharacter(字符串alphaNum)
{
如果(alphaNum==null)返回false;
试一试{
布尔值isRegex=false;
RE r=新的RE(“^.*”(?=[\\^%&$\\*:\\?/\\{\\\\\\}]).*”;
isRegex=r.match(alphaNum);
System.out.println(“isRegex:+isRegex”);
System.out.println(“空间”);
返回r.match(alphaNum);
}捕获(重新同步异常e){
返回false;
}
}
但是,我们需要接受这些字符的子集(:?/*&$),当我尝试删除“:”时,为了查看它是否有效,我得到了错误“语法错误:缺少要关闭的操作数”


我假设[]括号中的封闭字符集将是正在检查的字符集-这是错误的假设吗?更重要的是,如何从这个正则表达式中删除有效的字符列表,以便将其与字符串进行比较

整个方法过于复杂

您是否尝试过:

public static boolean checkInvalidCharacter (String alphaNum) {
    return alphaNum != null && alphaNum.matches(".*[\\^#%<>\\{\\|\\}].*");
}
公共静态布尔checkInvalidCharacter(字符串alphaNum){
返回alphaNum!=null&&alphaNum.matches(“.[\\^\\\%\\\\{\\\\\\\}].”);
}
或者更好:

public static final String INVALID_CHARACTERS = "^#%<>{}|";
private static final Pattern INVALID_PATTERN = Pattern.compile("["+Pattern.escape(INVALID_CHARACTERS)+"]");

public static boolean containsInvalidCharacters(String input) {
    return input != null && INVALID_PATTERN.matcher(input).find();
}
public静态最终字符串无效_字符=“^#%{}|”;
私有静态最终模式无效\u Pattern=Pattern.compile(“[”+Pattern.escape(无效的\u字符)+“]);
公共静态布尔值包含有效字符(字符串输入){
返回输入!=null&&INVALID_PATTERN.matcher(输入).find();
}

整个方法过于复杂

您是否尝试过:

public static boolean checkInvalidCharacter (String alphaNum) {
    return alphaNum != null && alphaNum.matches(".*[\\^#%<>\\{\\|\\}].*");
}
公共静态布尔checkInvalidCharacter(字符串alphaNum){
返回alphaNum!=null&&alphaNum.matches(“.[\\^\\\%\\\\{\\\\\\\}].”);
}
或者更好:

public static final String INVALID_CHARACTERS = "^#%<>{}|";
private static final Pattern INVALID_PATTERN = Pattern.compile("["+Pattern.escape(INVALID_CHARACTERS)+"]");

public static boolean containsInvalidCharacters(String input) {
    return input != null && INVALID_PATTERN.matcher(input).find();
}
public静态最终字符串无效_字符=“^#%{}|”;
私有静态最终模式无效\u Pattern=Pattern.compile(“[”+Pattern.escape(无效的\u字符)+“]);
公共静态布尔值包含有效字符(字符串输入){
返回输入!=null&&INVALID_PATTERN.matcher(输入).find();
}

我认为错误的原因可能是由于经过
的正则表达式不正确;或者,从
开始的字符串不正确。事实上,由于
没有转义,它实际上根本没有检查无效的
字符;未scaped的
在正则表达式中具有特殊意义。我不是正则表达式方面的专家,但根据中的表,一个未替换的冒号“在不记住匹配文本的情况下对正则表达式进行分组。”我不太清楚这意味着什么


我试着使用这个字符串
“^.*?(?=[\\^\\\\\\\\\\\\\\\\\\\\\\%]).*$”
,并对它进行了测试。这应该可以满足您的要求。

我认为错误的原因可能是因为经过
的正则表达式不正确;或者,从
开始的字符串不正确。事实上,由于
没有转义,它实际上根本没有检查无效的
字符;未scaped的
在正则表达式中具有特殊意义。我不是正则表达式方面的专家,但根据中的表,一个未替换的冒号“在不记住匹配文本的情况下对正则表达式进行分组。”我不太清楚这意味着什么


我试着使用这个字符串
“^.*?(?=[\\^\\\\\\\\\\\\\\\\\\\\\\%]).*$”
,并对它进行了测试。这应该可以满足您的需要。

您是否尝试过
re r=new re(“^.*[\\\\\\\\\\\\\}].$”?我认为你甚至可以省略所有转义符,因为在字符类中,
{
}
^
[/code>(和
*
)之后不在前面的位置
需要被转义一次(
\[\\]
),而
\
需要转义两次:`\\\`。您可以参考。我选择使用此白名单来代替:但是,对整个问题来说,精简和正确转义的建议是有帮助的,所以我仍然会接受答案。您是否尝试过
RE r=new RE(“^.[\^”%)\\{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.$”
在字符类中,
{
[/code>之后不在前面失去它们的特殊意义。我同意Wiktor:只有
[]
需要转义一次(
\\[\]
)和
\
两次:`\\\`。你可以参考。我选择使用这个白名单来代替:但是,关于精简和正确转义的建议对这个问题总体上是有帮助的,所以我仍然会接受答案。诚然,分配过程只是为了在第一时间捕获错误-但这和上面的评论帮了我很大的忙。我选择了另一种方法来解决这个问题,但我认为这个解决方案最适合我最初尝试做的事情。诚然,分配过程只是为了在第一时间捕捉错误——但这和上面的评论帮了我很大的忙。我选择了另一种解决方法g这个问题,但我认为这个解决方案最适合我最初尝试做的事情。