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})$”;
/.\\\\.
只需双斜杠即可/
贪婪地使用任何字符*
是一个转义反斜杠,后跟一个点,因此它成为一个文字点\\.
阻止字符串与生产域匹配的是第一个
\\\.
,因为它在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})$”代码>看看/.\\\\.
,小心点.*
是贪婪的,除了换行符之外,其他都匹配。所以剩下的部分什么也没做。