【问题标题】:Regex that starts with alphanumeric character and can have special characters in middle of the string(Java)以字母数字字符开头并且可以在字符串中间包含特殊字符的正则表达式(Java)
【发布时间】:2020-06-06 06:17:37
【问题描述】:

我希望正则表达式以字母数字开头,但可以在字符串中间包含特殊字符。字符串长度应小于 10,包括第一个字符。

接受的输入:

Hello!@+
t123123
H123!#

拒绝的输入:

@adadsa
@3asdasd
%sdf

我试过了

"^([a-zA-Z0-9]{1}).[a-zA-Z0-9@#$%^&+=]{2,10}$"

【问题讨论】:

  • 您还应该添加您尝试过的内容
  • 你的表达式中 {2,4} 的基本原理是什么?
  • @khelwood 我已经更新了。我已经插入它来检查字符串的长度
  • this 有帮助吗?
  • @user8588354 - 如果其中一个答案解决了您的问题,您可以通过将其标记为已接受来帮助社区。接受的答案有助于未来的访问者自信地使用该解决方案。查看meta.stackexchange.com/questions/5234/… 了解如何操作。

标签: java regex


【解决方案1】:

您可以使用以下正则表达式来实现您的目的:

^[\w][\S]{0,8}$

上述正则表达式的解释:

^ - 表示行首。

[\w] - 匹配 [0-9a-zA-Z_] 中的字符。 如果您不想要_(下划线),请手动提供字符类。[0-9A-Za-z]

[\S]{0,8} - 匹配任何非空格字符 0 到 8 次。

$ - 表示行尾。

可以找到上述正则表达式here.的demo

java实现:(您可以根据自己的需要修改代码)

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
    private static final Pattern pattern = Pattern.compile("^[\\w][\\S]{0,8}$", Pattern.MULTILINE);
    public static void main(String[] args) {
        final String string = "Hello!@+\n"
     + "t123123\n"
     + "H123!#\n"
     + "@adadsa\n"
     + "@3asdasd\n"
     + "%sdf\n"
     + "Helloworld1";
     
     Matcher matcher = pattern.matcher(string);
     while(matcher.find())
        System.out.println(matcher.group(0));
    }
}

您可以在here.中找到上述实现的示例运行

【讨论】:

  • $ 和 ^ 表示一行的开头和结尾,而不是字符串,如果您使用多行模式,它们的行为可能会有所不同。
  • 这里不需要两个 [] 实例。
  • 更新了@JimmyJames。谢谢。顺便说一句,实例很好;它们提高了可读性。
  • “它们提高了可读性” 怎么样?他们没有改变任何东西,让它看起来像是发生了更复杂的事情。通常如何解释事物以及如何在 [] 中解释事物也存在细微差别。基本上,您无缘无故地添加了“从此列表中选择一个”。
【解决方案2】:

根据您的描述,我认为这应该可行:

^[a-zA-Z0-9]\S{0,8}$

我不清楚你想把 ^ 放在前面,把 $ 放在最后。这意味着整行必须匹配。如果您只想匹配整个字符串,添加这些不会改变任何内容,并且您的模式对搜索没有用处。

如果您还没有看过,Pattern class javadocs 有很多有用的信息,包括支持的字符类。这些是 Java 7 文档,但我怀疑这些文档发生了很大变化。

【讨论】:

  • @Mandy 如果你使用pattern或Matcher中的matches()函数,整个字符串必须匹配。
  • 对@JimmyJames。但也许他想添加多个测试用例。但我同意你的看法。
【解决方案3】:

使用[\\p{Alnum}][\\S]{0,8} 作为正则表达式。

演示:

public class Main {
    public static void main(String[] args) {
        String[] arr = { "Hello!@+", "Hello!@+asdf", "t123123", "H123!#", "@adadsa", "@3asdasd", "%sdf" };
        String pattern = "[\\p{Alnum}][\\S]{0,8}";
        for (String s : arr) {
            System.out.println(s + " => " + (s.matches(pattern) ? "matches" : "does not match"));
        }
    }
}

输出:

Hello!@+ => matches
Hello!@+asdf => does not match
t123123 => matches
H123!# => matches
@adadsa => does not match
@3asdasd => does not match
%sdf => does not match

说明:

  1. \\p{Alnum} 匹配字母数字字符,\\S 匹配非空白字符。
  2. 使用[\\S]{0,8} 确保接下来最多八个字符可以是任何字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多