Java正则表达式:将定制的Hashtag模式与前向/后向条件匹配

Java正则表达式:将定制的Hashtag模式与前向/后向条件匹配,java,regex,Java,Regex,我目前正在学习如何通过尝试匹配简单的Hashtag模式来用Java编写正则表达式。哈希标记符合以下条件: 它以一个标签开始:# 它必须至少包含一个字母:[a-zA-Z] 它可以包含类[a-zA-Z0-9]中的任何字符 其前面不能有[a-zA-Z0-9! 基于此,我认为正确的正则表达式是: PATTERN = "(?<![a-zA-Z0-9_])#(?=.*[a-zA-Z])[a-zA-Z0-9_]+" 其中不匹配#此#u是_A_标签,#此_1_2和12_和_此 有人能解释一下我做错了什么

我目前正在学习如何通过尝试匹配简单的Hashtag模式来用Java编写正则表达式。哈希标记符合以下条件:

  • 它以一个标签开始:#
  • 它必须至少包含一个字母:[a-zA-Z]
  • 它可以包含类[a-zA-Z0-9]中的任何字符
  • 其前面不能有[a-zA-Z0-9!
  • 基于此,我认为正确的正则表达式是:

    PATTERN = "(?<![a-zA-Z0-9_])#(?=.*[a-zA-Z])[a-zA-Z0-9_]+"
    
    其中不匹配
    #此#u是_A_标签
    #此_1_2
    12_和_此

    有人能解释一下我做错了什么吗?

    这个怎么样

    它看起来符合您的标准,如所述:

    #THIS_IS_A_HASHTAG
    #This_1_2
    #12_and_this
    
    这一展望:

    (?=.*[a-zA-Z])
    
    当输入如下时,可能会产生错误的结果:

    ####12345...#12_and_this
    
    给你两个匹配项
    #12345
    #12_和_this
    。然而,根据你的规则,只有第二个应该是有效的匹配

    要解决此问题,可以使用以下正则表达式:

    (?<![a-zA-Z0-9_])#(?=[0-9_]*[a-zA-Z])[a-zA-Z0-9_]+
    
    (?
    其中,lookahead
    (?=[0-9.]*[a-zA-Z])
    表示在
    #
    之后断言字母的存在,其间可选存在数字或下划线


    您是如何尝试匹配的?运行此操作将导致重新匹配所有三个。您是对的。您建议的正则表达式通过了我昨天发布的示例,但它不能确保hashtag至少包含一个字母(这是我列出的条件,但未包含在示例中).我已经相应地更新了示例。对此表示抱歉!
    ####12345...#12_and_this
    
    (?<![a-zA-Z0-9_])#(?=[0-9_]*[a-zA-Z])[a-zA-Z0-9_]+