我尝试使用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我仍然无法让它工作,但它应该使事情更容易
1条答案
按热度按时间gg58donl1#
您可以使用以下模式,但捕获中会有其他文本。
并且,您可以按如下方式填充 groups Map。
输出量
然后,您可以从程序中删除附加文本,或者在模式中添加一组值。
输出量