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

Java正则表达式排序与\b

宫俊才
2023-03-14

当与单词boundary结合使用时,Java正则表达式面临一个奇怪的问题。通读Oracle-RegexBounds和RegularExpressions-WordBounders

下面是我的正则表达式(Java字符串)(用于电子邮件地址)

"\\b[A-Z0-9._!#$%&'*+-/=?^`{}|~]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$"

此正则表达式与电子邮件测试$@示例匹配。com,但不是$test@example.com

但是,当我删除(Java字符串)时,它会匹配这两封电子邮件。正则表达式中的所有特殊字符都是这样。

regex的排序中发生了什么?我认为那是

代码段:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ValidationUtil {

    private static final String EMAIL_ADDRESS_REGEX = "\\b[A-Z0-9._!#$%&'*+-/=?^`{}|~]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$";
    private static final Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile(EMAIL_ADDRESS_REGEX, Pattern.CASE_INSENSITIVE);

    public static boolean isValidEmail(String email) {
        if (email == null) {
            return false;
        }
        Matcher matcher = EMAIL_ADDRESS_PATTERN.matcher(email);
        return matcher.matches();
    }
}

在这个问题之后,我将regex验证移到了apache commons EmailValidator。但仍然好奇为什么会有这种奇怪的行为。

我浏览了许多有关stackoverflow的主题,但找不到相关的主题。

共有2个答案

酆浩邈
2023-03-14

首先,您需要在字符类中的第一个或最后一个位置放置未转义的连字符。其次,您不能在$之前使用单词边界,因为$不被视为单词字符。

这种基于regex lookbehind的修改应该适合您:

(?<!\w)[\w.!#$%&'*+/=?^`{}|~-]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$

此处(?

伯茂才
2023-03-14

要引用链接到的页面,请执行以下操作:

有三种不同的位置可以作为单词边界:

  • 如果第一个字符是单词字符,则在字符串中第一个字符之前

第一个字符不是单词字符,因此字符串开头不匹配,因此整个正则表达式不匹配。

 类似资料:
  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 问题内容: 在这里的问题中,我得到了正则表达式来匹配1到99之间的一组(或多个)数字,并用|隔开。或,(可以组合使用)。 我想对其进行更新以执行相同的操作,但现在接受0到99之间的数字。 此修改后的版本可以做到: 1个 但是现在接受空值(请参阅https://regex101.com/r/FfvavR/2) 题 如何修改低于1的regExp 以排除空值? 问题答案: 目前尚不清楚条目是有效还是无效

  • 问题内容: 我正在尝试输入之间的内容,我的模式没有做正确的事,请帮忙。 下面是sudocode: 要求的输出: 之一 二 三 问题答案: 先行使用并在循环中使用,而不是: 看到它在线上工作:ideone 但是最好在这里使用split: 看到它在线上工作:ideone

  • 主要内容:正则表达式支持字符正则表达式(Regular Expression)又称正规表示法、常规表示法,在代码中常简写为 regex、regexp 或 RE,它是计算机科学的一个概念。 正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作,是一种可以用于模式匹配和替换的规范。一个正则表达式就是由普通的字符(如字符 a~z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的

  • 问题内容: 我需要这件事的帮助。查看以下正则表达式: 我想查找这样的词:“自制”,“ aaaa-bbb”而不是“ aaa-bbb”,而 不是 “ aaa–aa–aaa”。基本上,我想要以下内容: 单词-连字符-单词。 它适用于所有内容,但该模式会通过:“ aaa–aaa–aaa”,但不应通过。哪种正则表达式适用于此模式? 问题答案: 可以从表达式中删除反斜杠: 下面的代码应该工作 请注意,您可以使

  • 问题内容: 用java 方法剥离输入的字符串(如MY-CORP \ My.Name)中的MY-CORP \部分的正则表达式是什么,这样我只能得到My.Name部分? 我试过了 但是我 在索引4 ^附近 遇到了 意外的内部错误。 * 问题答案: 您的问题是反斜杠在Java字符串和正则表达式中都有特殊含义。因此,您需要在Java源代码中使用四个斜杠,将两个斜杠传递给regex解析器以在regex中获得