Regex 如何区分这两种匹配器正则表达式模式

Regex 如何区分这两种匹配器正则表达式模式,regex,Regex,我有一个开发服务器和一个生产服务器。 扫描二维码后,我使用匹配器检查应该使用哪个服务器 开发服务器是: dev.example.com/product example.com/product 生产服务器是: dev.example.com/product example.com/product 以下是匹配器模式: private static String PRODUCT_CODE_PATTERN_DEV = "^https?://.*\\.example\\.com/product/(

我有一个开发服务器和一个生产服务器。 扫描二维码后,我使用匹配器检查应该使用哪个服务器

开发服务器是:

dev.example.com/product
example.com/product
生产服务器是:

dev.example.com/product
example.com/product
以下是匹配器模式:

private static String PRODUCT_CODE_PATTERN_DEV = "^https?://.*\\.example\\.com/product/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$";
private static String PRODUCT_CODE_PATTERN_PRODUCTION = "^https?://.*\\.example\\.com/product/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$";
private void getProductIdAndPrice(String url) {

    String id = "";
    int price = 0;
    Pattern pattern = Pattern.compile(Constant.getProductCodePattern());
    for (MatchResult match : allMatches(pattern, url)) {
        String mydata = match.group();
        Matcher matcher = pattern.matcher(mydata);
        if (matcher.find()) {
            id = matcher.group(1);
            price = Integer.parseInt(matcher.group(2));
            ..
        }
    }
}

public static String getProductCodePattern() {
    if (MyApplication.useProductionEndpoint) {
        return PRODUCT_CODE_PATTERN_PRODUCTION;
    } else {
        return PRODUCT_CODE_PATTERN_DEV;
    }
}
正如你现在看到的,它们是相等的,因为我不知道这部分:
/.\\\.
example\\.com/product/
之前代表什么,所以我不知道如何将“dev”放在那里

以前有一位开发人员提出了这些模式,这就解释了我是如何拥有它们的,而不知道它们是如何生成的

下面是这些模式的一些示例用法:

private static String PRODUCT_CODE_PATTERN_DEV = "^https?://.*\\.example\\.com/product/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$";
private static String PRODUCT_CODE_PATTERN_PRODUCTION = "^https?://.*\\.example\\.com/product/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$";
private void getProductIdAndPrice(String url) {

    String id = "";
    int price = 0;
    Pattern pattern = Pattern.compile(Constant.getProductCodePattern());
    for (MatchResult match : allMatches(pattern, url)) {
        String mydata = match.group();
        Matcher matcher = pattern.matcher(mydata);
        if (matcher.find()) {
            id = matcher.group(1);
            price = Integer.parseInt(matcher.group(2));
            ..
        }
    }
}

public static String getProductCodePattern() {
    if (MyApplication.useProductionEndpoint) {
        return PRODUCT_CODE_PATTERN_PRODUCTION;
    } else {
        return PRODUCT_CODE_PATTERN_DEV;
    }
}

/.\\\.
代表:

  • /
    literal//”如“http://”结尾所示
  • *
    任何文本
  • \\.
    一个点(
    \\
    是因为一个点需要转义)
您可以将服务器地址中的字母包含为文字,只需转义点:

代码:

private static String PRODUCT_code_PATTERN_DEV=“^https?://DEV\\.example\\.com/PRODUCT/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$”;
私有静态字符串PRODUCT_CODE_PATTERN_PRODUCTION=“^https?://example\\.com/PRODUCT/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$”;
/.\\\\.

  • /
    只需双斜杠即可
  • *
    贪婪地使用任何字符
  • \\.
    是一个转义反斜杠,后跟一个点,因此它成为一个文字点
从模式的使用方式(从url中提取产品ID)来看,我想有两种模式的原因是为了防止dev服务器引入新的产品ID系统。为了区分开发和生产,您似乎已经有了自己的变量。
阻止字符串与生产域匹配的是第一个
\\\.
,因为它在
example.com
之前强制执行
。如有必要,将其移除,圆点将由
*
匹配。
实际上,使用
*?
而不是
*
是有意义的,这将为正则表达式引擎节省一些步骤。如果一个子模式可能只匹配几个字符,比如在本例中,那么最好使用非贪婪量词

因此,最终,您可能需要的是:

private static String PRODUCT_CODE_PATTERN_DEV = "^https?://.*?example\\.com/product/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$";
private static String PRODUCT_CODE_PATTERN_PRODUCTION = "^https?://.*?example\\.com/product/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$";
如果您真的只想分别匹配开发和生产,您可以使用:

private static String PRODUCT_CODE_PATTERN_DEV = "^https?://dev\\.example\\.com/product/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$";
private static String PRODUCT_CODE_PATTERN_PRODUCTION = "^https?://(?:www\\.)?example\\.com/product/(?:[A-Z]{2})?01([A-Za-z0-9]{6})([0-9-][0-9]{2})$";
请注意,我引入了
(?:www\\)?
,这样生产域仍然可以在必要时以
www.
作为前缀。如果你不需要它,你可以把它拿走


我想推荐。它解释了给定正则表达式的所有部分,还可以让您随意使用。

Java?最好包括主机语言标记。如果您想匹配dev URL,您可能需要将
dev
添加到正则表达式:
PRODUCT_code_PATTERN_dev=“^https?://dev\\\.example\\\\.com/PRODUCT/(?:[A-Z]{2})-01([A-Za-z0-9]{6})([0-9-][0-9]{2})$”看看
/.\\\\.
,小心点
.*
是贪婪的,除了换行符之外,其他都匹配。所以剩下的部分什么也没做。