Java 匹配正则表达式中的最长字符串或公共子字符串

Java 匹配正则表达式中的最长字符串或公共子字符串,java,regex,regex-greedy,Java,Regex,Regex Greedy,在正则表达式或中,当有多个输入具有公共前缀时,正则表达式将匹配regex或中的第一个输入,而不是最长匹配 例如,对于正则表达式regex=(KA | KARNATAKA)和input=KARNATAKA,输出将是2个匹配match1=KA和match2=KA 但我想要的是在Regex或中对给定输入进行尽可能长的匹配,在我的示例中是match1=KARNATAKA 所以我现在要做的是,我将输入按长度降序排列在Regex或中 我的问题是,我们是否可以在正则表达式中指定匹配最长字符串?还是排序是唯一

在正则表达式或中,当有多个输入具有公共前缀时,正则表达式将匹配
regex或
中的第一个输入,而不是最长匹配

例如,对于正则表达式
regex=(KA | KARNATAKA)
input=KARNATAKA
,输出将是2个匹配
match1=KA
match2=KA

但我想要的是在
Regex或
中对给定输入进行尽可能长的匹配,在我的示例中是
match1=KARNATAKA

所以我现在要做的是,我将输入按长度降序排列在
Regex或

我的问题是,我们是否可以在正则表达式中指定匹配最长字符串?还是排序是唯一的方法

您可以使用单词边界(
\b
)来避免匹配前缀

对于您提到的情况:以下正则表达式将只匹配
KA
卡纳塔克邦

(\bKA\b|\bKARNATAKA\b)

您可以为此创建帮助器方法:

public final class PatternHelper {
    public static Pattern compileSortedOr(String regex) {
        Matcher matcher = Pattern.compile("(.*)\\((.*\\|.*)\\)(.*)").matcher(regex);

        if (matcher.matches()) {
            List<String> conditions = Arrays.asList(matcher.group(2).split("\\|"));
            List<String> sortedConditions = conditions.stream()
                                                      .sorted((c1, c2) -> c2.length() - c1.length())
                                                      .collect(Collectors.toList());

            return Pattern.compile(matcher.group(1) +
                                       "(" +
                                       String.join("|", sortedConditions) +
                                       ")" +
                                       matcher.group(3));
        }

        return Pattern.compile(regex);
    }
}

Matcher matcher = PatternHelper.compileSortedOr("(KA|KARNATAKA)").matcher("KARNATAKA");
if (matcher.matches()) {
    System.out.println(matcher.group(1));
}

另外,这只适用于没有嵌套括号的简单表达式。如果您希望得到很多复杂的表达式,则需要进行调整。

试试这个\b(卡纳塔克邦)\b@SHAHAKASH如果他想匹配KARNA怎么办。您的解决方案
\b(KA | KARNA)\b
不起作用有什么问题阻止您排序?@Jai当输入非常少或是一次性作业时,排序输入没有问题。当我们有大量的输入,并且必须一次又一次地动态地执行时,就会出现性能问题。我只是想知道我们是否可以让
Regex引擎处理这个问题。试着使用单词boundary
\b
(\bKA\b | \bKARNATAKA\b)
可以,如果他想匹配KARNA怎么办。你的解决方案(\bKA\b |\bKARNATAKA\b)在评论中看不到。@SHAHAKASH它不应该匹配“KARNA”。他想要最长的匹配。@SHAHAKASH最长的精确匹配。如果String test=“KA KARN”-->那么他想要的是KARN,而不是KA,如果我没有错的话,这是个问题。
KARNATAKA