Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使用java.util.regex匹配输入中的特定格式? 输入_Java_Regex - Fatal编程技术网

如何在java中使用java.util.regex匹配输入中的特定格式? 输入

如何在java中使用java.util.regex匹配输入中的特定格式? 输入,java,regex,Java,Regex,输入可以是如下所示的任何形式,并具有以下强制内容TXT{任何格式的任何逗号分隔字符串} 所需输出 一,。与loginURL相对应的OutputURL 二,。如有,请删除 我的尝试 获得的产出 上述模式的缺点 如果我在TXT{}之间添加任何包含字符如,%,@的字符串,那么我的代码将中断 如何使用java.util.regex库实现此功能,以便用户可以在TXT{any comma separated Strings}之间输入任何逗号分隔的字符串。我建议使用Matcher.appendReplacem

输入可以是如下所示的任何形式,并具有以下强制内容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}-> 所以我们需要做的是在正则表达式中测试这些情况。模式如下:

(\\?)?&?(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");
}