如何在java中使用java.util.regex匹配输入中的特定格式? 输入
输入可以是如下所示的任何形式,并具有以下强制内容TXT{任何格式的任何逗号分隔字符串} 所需输出 一,。与loginURL相对应的OutputURL 二,。如有,请删除 我的尝试 获得的产出 上述模式的缺点 如果我在TXT{}之间添加任何包含字符如,%,@的字符串,那么我的代码将中断 如何使用java.util.regex库实现此功能,以便用户可以在TXT{any comma separated Strings}之间输入任何逗号分隔的字符串。我建议使用Matcher.appendReplacement: 输出: 处理http://ip:port/path?username=abcd&location={LOCATION}&TXT{UE-IP,UE用户名,UE密码}&Password={PASS} 找到TXT{UE-IP,UE用户名,UE密码} 处理http://ip:port/path?username=abcd&location={LOCATION}&password={PASS} 处理http://ip:port/path?username=abcd&location={LOCATION}&password={PASS}&TXT{UE-IP,UE用户名,UE密码} 找到TXT{UE-IP,UE用户名,UE密码} 处理http://ip:port/path?username=abcd&location={LOCATION}&password={PASS} 处理http://ip:port/path?TXT{UE-IP,UE用户名,UE密码}&Username=abcd&location={location}&Password={PASS} 找到TXT{UE-IP,UE用户名,UE密码} 处理http://ip:port/path?username=abcd&location={LOCATION}&password={PASS} 处理http://ip:port/path?TXT{UE-IP,UE用户名,UE密码} 找到TXT{UE-IP,UE用户名,UE密码} 处理http://ip:port/path 处理http://ip:port/path?username=abcd&password={PASS} 处理http://ip:port/path?username=abcd&password={PASS} 正如你正确指出的,有3种可能的情况: ?{TEXT}&->? &{TEXT}&->& ?{TEXT}-> 所以我们需要做的是在正则表达式中测试这些情况。模式如下:如何在java中使用java.util.regex匹配输入中的特定格式? 输入,java,regex,Java,Regex,输入可以是如下所示的任何形式,并具有以下强制内容TXT{任何格式的任何逗号分隔字符串} 所需输出 一,。与loginURL相对应的OutputURL 二,。如有,请删除 我的尝试 获得的产出 上述模式的缺点 如果我在TXT{}之间添加任何包含字符如,%,@的字符串,那么我的代码将中断 如何使用java.util.regex库实现此功能,以便用户可以在TXT{any comma separated Strings}之间输入任何逗号分隔的字符串。我建议使用Matcher.appendReplacem
(\\?)?&?(TXT\\{[^}]++})(&)?
说明:
\\?? 可选地匹配并捕获?
&? 可选地捕获&
TXT\\{[^}]+}匹配并捕获TXT,后跟{,后跟一个或大多数非}占有,后跟}结束括号不需要转义
&? 可选地匹配并捕获&
我们有3个小组:
可能是一个?
所需文本
潜在的&
现在,当我们找到匹配项时,我们需要替换为案例1..3的适当捕获
如果第1组和第3组都存在:
我们必须在案例1中;我们必须用什么来代替?在第一组,所以1美元
否则,我们在案例2或案例3中:
在案例2中,我们需要替换为&而在案例3中,我们需要替换为。
在案例2中,第3组将有效&在案例3中,它将有效,因此我们可以在这两种情况下用3美元替换
在这里,我仅使用匹配组捕获TXT{…}部分。这意味着,虽然领先?或&被替换,它不在找到的字符串中。你只需要{}之间的位,然后移动括号
请注意,我重用了该模式——如果性能是一个问题,您也可以这样做。您应该始终重用该模式,因为创建该模式非常昂贵。如果可以的话,将其存储在静态的final中-它是线程安全的,匹配器不是。通常的方法是将模式存储在静态final中,然后在方法上下文中重用Matcher
此外,Matcher.appendReplacement的使用比您当前的方法更有效,因为它只需要处理一次输入。您的方法将解析字符串两次。我建议使用Matcher.appendReplacement:
输出:
处理http://ip:port/path?username=abcd&location={LOCATION}&TXT{UE-IP,UE用户名,UE密码}&Password={PASS}
找到TXT{UE-IP,UE用户名,UE密码}
处理http://ip:port/path?username=abcd&location={LOCATION}&password={PASS}
处理http://ip:port/path?username=abcd&location={LOCATION}&password={PASS}&TXT{UE-IP,UE用户名,UE密码}
找到TXT{UE-IP,UE用户名,UE密码}
处理http://ip:port/path?username=abcd&location={LOCATION}&password={PASS}
处理http://ip:port/path?TXT{UE-IP,UE用户名,UE密码}&Username=abcd&location={location}&Password={PASS}
找到TXT{UE-IP,UE用户名,UE密码}
处理http://ip:port/path?username=abcd&location={LOCATION}&password={PASS}
处理http://ip:port/path?TXT{UE-IP,UE用户名,UE密码}
找到TXT{UE-IP,UE用户名,UE密码}
处理http://ip:port/path
处理http://ip:port/path?username=abcd&password={PASS}
处理http://ip:port/path?username=abcd&password={PASS}
正如你正确指出的,有3种可能的情况:
?{TEXT}&->?
&{TEXT}&->&
?{TEXT}->
所以我们需要做的是在正则表达式中测试这些情况。模式如下:
(\\?)?&?(TXT\\{[^}]++})(&)?
说明:
\\?? 可选地匹配并捕获?
&? 可选地捕获&
TXT\\{[^}]+}匹配并捕获TXT,后跟{,后跟一个或大多数非}占有,后跟}结束括号不需要转义
&? 可选地匹配并捕获&
我们有3个小组:
可能是一个?
所需文本
有强效的
艾利安&
现在,当我们找到匹配项时,我们需要替换为案例1..3的适当捕获
如果第1组和第3组都存在:
我们必须在案例1中;我们必须用什么来代替?在第一组,所以1美元
否则,我们在案例2或案例3中:
在案例2中,我们需要替换为&而在案例3中,我们需要替换为。
在案例2中,第3组将有效&在案例3中,它将有效,因此我们可以在这两种情况下用3美元替换
在这里,我仅使用匹配组捕获TXT{…}部分。这意味着,虽然领先?或&被替换,它不在找到的字符串中。你只需要{}之间的位,然后移动括号
请注意,我重用了该模式——如果性能是一个问题,您也可以这样做。您应该始终重用该模式,因为创建该模式非常昂贵。如果可以的话,将其存储在静态的final中-它是线程安全的,匹配器不是。通常的方法是将模式存储在静态final中,然后在方法上下文中重用Matcher
此外,Matcher.appendReplacement的使用比您当前的方法更有效,因为它只需要处理一次输入。您的方法会对字符串进行两次解析。使用合适的JSON解析器不是更好吗?您用JSON一词误解了它,我已将它改为TXT。请查看更新。您是否真的想保留输出URL1末尾的(&a)?@Keppil不,没有类似的事情。将对其进行编辑…嗯,这不是您正在处理的URI模板吗?使用合适的JSON解析器不是更好吗?您用JSON一词误解了它,我已将其更改为TXT。请查看更新。您是否真的想保留输出URL1结尾处的(&a)?@Keppil不,没有类似的事情。将编辑它…嗯,这不是您正在处理的URI模板吗?我还需要替换的字符串。它没有解决我的问题,对于第三个输入,实际的是{LOCATION}&password={PASS},需要的是{LOCATION}&password={PASS}请慢慢来,我将等待您的解决方案。@Prateek可能会感兴趣-这就是为什么花了这么长时间才找到答案。我还需要替换的字符串。它没有解决我的问题,对于第三个输入,实际的是{LOCATION}&password={PASS},需要的是{LOCATION}&password={PASS}请慢慢来,我会等待你的解决办法。@Prateek可能会感兴趣——这就是为什么花了这么长时间才找到答案的原因。
String deletedPatteren = TXT{UE-IP,UE-Username,UE-Password}
String loginURLPattern = TXT+"\\{([\\w-,]*)\\}&*";
System.out.println("1. ");
getListOfTemplates(loginURL, loginURLPattern);
System.out.println();
System.out.println("2. ");
getListOfTemplates(loginURL1, loginURLPattern);
System.out.println();
private static void getListOfTemplates(String inputSequence,String pattern){
System.out.println("Input URL : " + inputSequence);
Matcher templateMatcher = Pattern.compile(pattern).matcher(inputSequence);
if (templateMatcher.find() && templateMatcher.group(1).length() > 0) {
System.out.println(templateMatcher.group(1));
System.out.println("OutputURL : " + templateMatcher.replaceAll(""));
}
}
1.
Input URL : http://ip:port/path?username=abcd&location={LOCATION}&TXT{UE-IP,UE-Username,UE-Password}&password={PASS}
UE-IP,UE-Username,UE-Password}&password={PASS
OutputURL : http://ip:port/path?username=abcd&location={LOCATION}&
2.
Input URL : http://ip:port/path?username=abcd&location={LOCATION}&password={PASS}&TXT{UE-IP,UE-Username,UE-Password}
UE-IP,UE-Username,UE-Password
OutputURL : http://ip:port/path?username=abcd&location={LOCATION}&password={PASS}&
public static void main(final String[] args) throws Exception {
final String[] loginURLs = {
"http://ip:port/path?username=abcd&location={LOCATION}&TXT{UE-IP,UE-Username,UE-Password}&password={PASS}",
"http://ip:port/path?username=abcd&location={LOCATION}&password={PASS}&TXT{UE-IP,UE-Username,UE-Password}",
"http://ip:port/path?TXT{UE-IP,UE-Username,UE-Password}&username=abcd&location={LOCATION}&password={PASS}",
"http://ip:port/path?TXT{UE-IP,UE-Username,UE-Password}",
"http://ip:port/path?username=abcd&password={PASS}"};
final Pattern patt = Pattern.compile("(\\?)?&?(TXT\\{[^}]++})(&)?");
for (final String loginURL : loginURLs) {
System.out.printf("%1$-10s %2$s%n", "Processing", loginURL);
final StringBuffer sb = new StringBuffer();
final Matcher matcher = patt.matcher(loginURL);
while (matcher.find()) {
final String found = matcher.group(2);
System.out.printf("%1$-10s %2$s%n", "Found", found);
if (matcher.group(1) != null && matcher.group(3) != null) {
matcher.appendReplacement(sb, "$1");
} else {
matcher.appendReplacement(sb, "$3");
}
}
matcher.appendTail(sb);
System.out.printf("%1$-10s %2$s%n%n", "Processed", sb.toString());
}
}
(\\?)?&?(TXT\\{[^}]++})(&)?
if (matcher.group(1) != null && matcher.group(3) != null) {
matcher.appendReplacement(sb, "$1");
} else {
matcher.appendReplacement(sb, "$3");
}