当前位置: 首页 > 知识库问答 >
问题:

Java REGEX 允许排除字符 [重复]

子车俊哲
2023-03-14

我有 REGEX,我希望在下面排除某些字符。正确排除这些字符:£“~#¬|{} 但这些不是: @[]/?;:

因此,例如,test£test 被正确标识为无效,但test@test被错误地标识为有效。

在https://regex101.com/上测试发现问题在于括号,并指出我需要转义第一个([括号]和-[连字符],就像这样- ^[a-zA-z0-9!$%^

有什么办法可以让这个正则表达式按照我想要的那样运行吗?抱歉,如果这很明显的话。

         final String REGEX = "^[a-zA-z0-9!$%^&*()-_=+]+?$";
         System.out.println ("Please enter a password");
         String password = input.next();
         Pattern p = Pattern.compile(REGEX);
         Matcher m = p.matcher(password);
         if (!m.matches()){
            System.out.println("Illegal characters");

共有3个答案

蓟辰沛
2023-03-14

抱歉-我现在意识到我有很多元字符都需要转义。以下REGEX的行为符合预期,使用双反斜杠转义每个元字符:

final String REGEX = "^[a-zA-z0-9\\!\\$%\\^&*\\(\\)\\-_\\=\\+]+?$";

如果有更优雅的方式我很想听听!

罗昊明
2023-03-14

正则表达式的问题在于它包含需要转义的特殊字符。

如果此页中引用的所有字符在密码中有效,则需要转义。

模式文档

因此,您应该使用如下正则表达式。然而,我还没有彻底测试过这个,所以请编写一些彻底的单元测试来涵盖所有合法的可能性。

"^[a-zA-z0-9!\\$%\\^&\\*\\(\\)\\-_\\=\\+]+?$"
巫马松
2023-03-14
^[a-zA-z0-9!$%^&*()-_=+]+?$
     ^^^          ^^^

第一个带下划线的范围是A-z。这匹配:

ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

第二个带下划线的范围对应于

)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_

请看这里使用的正则表达式:注意正则表达式只是下面第一个例子的集合。这是为了显示它实际匹配的字符。

使用以下任一项

^[a-zA-Z0-9!$%^&*()\-_=+]+?$
^[a-zA-Z0-9!$%^&*()_=+-]+?$
^[\w!$%^&*()=+-]+?$
^[\w!$%&^(-+=-]+?$
 类似资料:
  • 我正在考虑从Hibernate转移到jOOQ,但我找不到例如如何在Hibernate中对这样的进行Pattern约束: 在jOOQ我该怎么做?

  • 问题内容: 我正在使用Base64编码来编码Java中的用户ID字段。 我想知道上面的字符串abc是否包含字符“,:”吗? 当以abc返回Base64编码的字符串时,它是否会包含以下字符? 问题答案: 您不会在Base64编码的字符串中看到任何逗号,冒号或双引号。由于等号用于填充结尾内容,因此您会看到等号。

  • 我试图找到一种方法来确定一个字符串是否至少包含n个特定顺序的字符。 我正在处理大量的手写数据,错别字的数量相当疯狂。 我需要在一个大字符串中查找文本部分,如下所示: 看起来有点奇怪,但很管用。 不幸的是,怪异还不止于此。我需要修改这个regex,以便它也允许每个单词中缺少1个字母。 因此,我需要修改这个regex,以便它也适用于以下内容: 我一直在研究{4},但我不确定这是正确的方向,也不确定它是

  • 问题内容: 我似乎无法使实例正常工作。我使用的代码如下: 子类 该代码输出 问题答案: 您需要覆盖。而不是这样做,您实现了一个带有signature 的方法。因此,您使用的是为相等性测试定义的默认方法。 默认实现基于对象标识,因此,该集合“允许”您添加两个在语义上相等的不同对象。

  • 我有一个程序有很多数据对象。每种方法都实现了可比性,并设置为从最高到最低(基于简单的长值)排序,包括重复的值。我希望这些对象存储在一个集合/列表中,这样我就可以遍历它,并在其各自的位置取出每个对象。 我已经研究过使用树集,但是这不允许重复,因此只保留具有相同值的多个对象中的一个。然后我找到了TreeMultiset,它可以保持元素具有相同的值。唯一的问题是,它只是存储同一对象的副本,而不是多个相等

  • 我一直在捕捉非数字时遇到问题。 我试过了,但抓不住。如果我让它捕获非数字,但不让用户再次尝试输入。。。它完全停止了我的代码。 这是我的密码: