我有一个开发服务器和一个生产服务器。 在扫描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"]];
答案 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。它解释了给定正则表达式的所有部分,也让你玩。