首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在java中仅拆分中文字符

在java中仅拆分中文字符
EN

Stack Overflow用户
提问于 2009-11-05 02:27:58
回答 3查看 5.5K关注 0票数 7

我正在编写一个java应用程序,但我一直停留在这一点上。

基本上我有一个中文字符串,还有一些可能的拉丁字符或数字,让我们这样说:

代码语言:javascript
运行
复制
查詢促進民間參與公共建設法(210BOT法).

我想拆分那些中文字符,除了上面的"BOT“之外的拉丁文或数字。所以,在最后,我会得到这样的列表:

[ 查, 詢, 促, 進, 民, 間, 參, 與, 公, 共, 建, 設, 法, (, 210, BOT, 法, ), ., ]

我如何解决这个问题(对于java)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-05 02:46:42

中文字符在特定的Unicode范围内:

  • 2F00-2FDF:康熙
  • 4E00-9FAF: CJK
  • 3400-4DBF: CJK Extension

所以基本上你需要做的就是检查字符的码点是否在已知的范围内。此示例是编写基于堆栈的解析器/拆分器的一个很好的起点,您只需将其扩展为将数字与拉丁字母分开,这应该足够明显(提示:Character#isDigit()):

代码语言:javascript
运行
复制
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");
    }
}

祝好运。

票数 10
EN

Stack Overflow用户

发布于 2009-11-05 03:01:24

这是一个我会采用的方法。

可以使用Character.codePointAt(char[] charArray,int index)返回字符数组中字符的Unicode值。

您还需要一个拉丁Unicode字符的映射。

如果你查看Character.UnicodeBlock的源代码,你会发现完整的拉丁语块是区间0x0000,0x0249。所以基本上你要检查你的Unicode代码点是否在这个间隔内。

我怀疑有一种方法可以只使用Character.Subset来检查它是否包含您的字符,但我还没有研究过。

票数 1
EN

Stack Overflow用户

发布于 2012-06-11 13:28:46

我是一个彻头彻尾的Lucene新手。

使用最新版本的Lucene (在撰写本文时为3.6.0),我设法接近您所需要的结果。

代码语言:javascript
运行
复制
  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.
  }

我得到的结果是:

代码语言:javascript
运行
复制
[查, 詢, 促, 進, 民, 間, 參, 與, 公, 共, 建, 設, 法, 210bot, 法]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1675739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档