我正在编写一个java应用程序,但我一直停留在这一点上。
基本上我有一个中文字符串,还有一些可能的拉丁字符或数字,让我们这样说:
查詢促進民間參與公共建設法(210BOT法).我想拆分那些中文字符,除了上面的"BOT“之外的拉丁文或数字。所以,在最后,我会得到这样的列表:
[ 查, 詢, 促, 進, 民, 間, 參, 與, 公, 共, 建, 設, 法, (, 210, BOT, 法, ), ., ]
我如何解决这个问题(对于java)?
发布于 2009-11-05 02:46:42
中文字符在特定的Unicode范围内:
所以基本上你需要做的就是检查字符的码点是否在已知的范围内。此示例是编写基于堆栈的解析器/拆分器的一个很好的起点,您只需将其扩展为将数字与拉丁字母分开,这应该足够明显(提示:Character#isDigit()):
Set<UnicodeBlock> chineseUnicodeBlocks = new HashSet<UnicodeBlock>() {{
add(UnicodeBlock.CJK_COMPATIBILITY);
add(UnicodeBlock.CJK_COMPATIBILITY_FORMS);
add(UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS);
add(UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT);
add(UnicodeBlock.CJK_RADICALS_SUPPLEMENT);
add(UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION);
add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS);
add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A);
add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B);
add(UnicodeBlock.KANGXI_RADICALS);
add(UnicodeBlock.IDEOGRAPHIC_DESCRIPTION_CHARACTERS);
}};
String mixedChinese = "查詢促進民間參與公共建設法(210BOT法)";
for (char c : mixedChinese.toCharArray()) {
if (chineseUnicodeBlocks.contains(UnicodeBlock.of(c))) {
System.out.println(c + " is chinese");
} else {
System.out.println(c + " is not chinese");
}
}祝好运。
发布于 2009-11-05 03:01:24
这是一个我会采用的方法。
可以使用Character.codePointAt(char[] charArray,int index)返回字符数组中字符的Unicode值。
您还需要一个拉丁Unicode字符的映射。
如果你查看Character.UnicodeBlock的源代码,你会发现完整的拉丁语块是区间0x0000,0x0249。所以基本上你要检查你的Unicode代码点是否在这个间隔内。
我怀疑有一种方法可以只使用Character.Subset来检查它是否包含您的字符,但我还没有研究过。
发布于 2012-06-11 13:28:46
我是一个彻头彻尾的Lucene新手。
使用最新版本的Lucene (在撰写本文时为3.6.0),我设法接近您所需要的结果。
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36, Collections.emptySet());
List<String> words = new ArrayList<String>();
TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(original));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);
try {
tokenStream.reset(); // Resets this stream to the beginning. (Required)
while (tokenStream.incrementToken()) {
words.add(termAttribute.toString());
}
tokenStream.end(); // Perform end-of-stream operations, e.g. set the final offset.
}
finally {
tokenStream.close(); // Release resources associated with this stream.
}我得到的结果是:
[查, 詢, 促, 進, 民, 間, 參, 與, 公, 共, 建, 設, 法, 210bot, 法]https://stackoverflow.com/questions/1675739
复制相似问题