java 如何在正则表达式中检测和提取组的多次出现

rqdpfwrv  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(117)

我尝试使用Java中的正则表达式从给定的字符串中提取特定的组。该模式包含一个选项,用于捕获“such as”短语后面未知数量的<np>元素,我希望能够保存所有这些元素。然而,在我当前的实现中,我似乎覆盖了一些组,而遗漏了其他组。
下面是我目前为止的代码:

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Detector {
    private final String input;
    private final String pattern;
    private final String lemma;
    private final Map<Integer, String> groups;

    public Detector(String input, String pattern, String lemma) {
        this.input = input;
        this.pattern = pattern;
        this.lemma = lemma;
        this.groups = new HashMap<>();
        processInput();
    }

    public void processInput() {
        Pattern regex = Pattern.compile(pattern);
        Matcher matcher = regex.matcher(input);

        int groupIndex = 1;

        if (matcher.find()) {
            groups.put(groupIndex, matcher.group(1));
            groupIndex++;

            for (int i = 2; i <= matcher.groupCount(); i++) {
                String group = matcher.group(i);
                if (group != null ) {
                    groups.put(groupIndex, group);
                    groupIndex++;
                }
            }
        }

        System.out.println(groups);
    }

    public static void main(String[] args) {
        String input = "<np>semitic languages such as <np>Hebrew ,<np>mip ,<np>bip ,<np>bop or <np>Arabic";
        String pattern = "<np>,?([\\w\\s]+)\\s+such as\\s+<np>([\\w]+)\\s(?:,<np>([\\w]+)\\s)*(?:(?:and|or)\\s<np>([\\w]+))?";
        Detector suchAs = new Detector(input, pattern, "mip");
    }
}

我得到的当前输出是{1=semitic languages, 2=Hebrew, 3=bop, 4=Arabic},但似乎我遗漏了组mip和bip。我怀疑我正在覆盖它们,但我不确定如何在它们被覆盖之前保存它们。
任何帮助将不胜感激。谢谢!edit:我被赋予了一个更容易的任务,每个np将标记在其beggining和结束如下闪族语言,如希伯来语,bip bop或阿拉伯语是由辅音和voyels我仍然无法让它工作,但它应该使事情更容易

gg58donl

gg58donl1#

您可以使用以下模式,但捕获中会有其他文本。

(?:<np>(.+?)(?=<np>|$))+?

并且,您可以按如下方式填充 groups Map。

public void processInput() {
    Pattern regex = Pattern.compile(pattern);
    Matcher matcher = regex.matcher(input);

    int groupIndex = 1;

    while (matcher.find())
        groups.put(groupIndex++, matcher.group(1));

    System.out.println(groups);
}

输出量

{1=semitic languages such as , 2=Hebrew ,, 3=mip ,, 4=bip ,, 5=bop or , 6=Arabic}

然后,您可以从程序中删除附加文本,或者在模式中添加一组值。

(?:<np>(.+?)(?=(?: languages such as | ,| or )<np>|$))+?

输出量

{1=semitic, 2=Hebrew, 3=mip, 4=bip, 5=bop, 6=Arabic}

相关问题