【问题标题】:A custom tokenizer for JavaJava的自定义标记器
【发布时间】:2013-07-18 12:46:47
【问题描述】:
我正在开发一个应用程序,我需要在其中处理包含电子邮件的文本文件。我需要文本中的所有标记,以下是标记的定义:
- 字母数字
- 区分大小写(要保留大小写)
- '!'和 '$' 将被视为组成字符。例如:
FREE!!、$50 是令牌
-
'.' (dot) 和 ',' 逗号如果出现在数字之间,将被视为组成字符。例如:
192.168.1.1,24,500 美元
是令牌。
等等..
请向我推荐一些用于 Java 的开源标记器,这些标记器易于定制以满足我的需求。仅使用 StringTokenizer 和正则表达式就足够了吗?我还必须执行停止,这就是为什么我一直在寻找一个开源标记器,它还将执行一些额外的操作,例如停止、词干提取。
【问题讨论】:
标签:
java
token
tokenize
text-processing
text-analysis
【解决方案1】:
前面几个cmets:
StringTokenizer 是为了兼容性而保留的遗留类
原因尽管在新代码中不鼓励使用它。推荐
任何寻求此功能的人都使用 String 的 split 方法
或 java.util.regex 包。
至于正则表达式,这实际上取决于您的要求。鉴于上述情况,这可能有效:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Mkt {
public static void main(String[] args) {
Pattern p = Pattern.compile("([$\\d.,]+)|([\\w\\d!$]+)");
String str = "--- FREE!! $50 192.168.1.1 $24,500";
System.out.println("input: " + str);
Matcher m = p.matcher(str);
while(m.find()) {
System.out.println("token: " + m.group());
}
}
}
这是一个示例运行:
$ javac Mkt.java && java Mkt
input: --- FREE!! $50 192.168.1.1 $24,500
token: FREE!!
token: $50
token: 192.168.1.1
token: $24,500
现在,您可能需要调整正则表达式,例如:
- 您以
$24,500 为例。这是否适用于 $24,500abc 或 $24,500EUR?
- 您提到应该包括
192.168.1.1。是否还应包括192,168.1,1(假设. 和, 将被包括在内)?
我想还有其他事情需要考虑。
希望这有助于您入门。