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

时间:2015-09-07 17:12:21

标签: regex

我有一个开发服务器和一个生产服务器。 在扫描qr代码时,我使用匹配器来检查应该使用哪个服务器

dev服务器是:

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})$";

以下是匹配器模式:

//.*\\.

正如你所看到的那样,他们是平等的,因为我不知道这部分是什么:example\\.com/product/代表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; } } 之前所以我不知道如何放置" dev"那里。

之前的开发人员已经提出了这些模式,因此解释了我如何拥有它们,而不知道它们是如何生成的。

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

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];

2 个答案:

答案 0 :(得分:1)

//.*\\.代表:

  • //字面意思" //"在" 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})$";
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})$";

答案 1 :(得分:1)

//.*\\.

  • //只是双斜线
  • .*贪图消费任何角色
  • \\.是一个转义后的反斜杠后跟一个点,因此它变成了一个字面点。

从模式的使用方式(从网址中提取产品ID),我猜其中有两个是因为开发服务器引入了新的产品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})$";

如果你真的只想分别匹配dev和production,你可以使用:

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.作为前缀,如有必要。如果您不需要,可以删除它。

我想推荐regex101。它解释了给定正则表达式的所有部分,也让你玩。