2011-09-25 84 views
2

我需要使用一个标记器,它将空白分割为单词,但如果空白在双括号中则不会分割。下面一个例子:如何扩展WhitespaceTokenizer?

My input-> term1 term2 term3 ((term4 term5)) term6 

应该产生令牌名单:

term1, term2, term3, ((term4 term5)), term6. 

我认为我可以通过扩展Lucene的WhiteSpaceTokenizer获得此行为。我怎样才能执行这个扩展?
还有其他解决方案吗?

在此先感谢。

回答

2

我没有试过扩展标记生成器,但我在这里用正则表达式一个不错的(我认为)解决方案:

\w+|\(\([\w\s]*\)\) 

和从REG通过匹配组分割字符串的方法ex返回一个数组。代码示例:

class Regex_ComandLine { 

public static void main(String[] args) { 
    String input = "term1 term2 term3 ((term4 term5)) term6"; //your input 
    String[] parsedInput = splitByMatchedGroups(input, "\\w+|\\(\\([\\w\\s]*\\)\\)"); 

    for (String arg : parsedInput) { 
     System.out.println(arg); 
    } 
} 

static String[] splitByMatchedGroups(String string, 
              String patternString) { 
    List<String> matchList = new ArrayList<>(); 
    Matcher regexMatcher = Pattern.compile(patternString).matcher(string); 

    while (regexMatcher.find()) { 
     matchList.add(regexMatcher.group()); 
    } 

    return matchList.toArray(new String[0]); 
} 

}

输出:

term1 
term2 
term3 
((term4 term5)) 
term6 

希望这有助于你。

请注意,下面的代码与通常split()

String[] parsedInput = input.split("\\w+|\\(\\([\\w\\s]*\\)\\)"); 

将返回什么,或者你想怎么一回事,因为它只检查分隔符不算什么。

+0

谢谢。我想我会用这种方法最简单,我可以获得与扩展WhitespaceTokenizer相同的结果。再次感谢你:) –

1

您可以通过扩展WhitespaceTokenizer做到这一点,但我相信,如果你写一个​​从一个WhitespaceTokenizer和粘贴在一起连续读取的标记根据括号的数量会比较容易。

覆盖incrementToken是编写类似Tokenizer类的主要任务。我自己曾经这样做过; the result可能会作为一个例子(虽然由于技术原因,我不能让我的班级TokenFilter)。