智能将大型文本拆分为单词和符号,如空格和其他字符

时间:2014-03-03 11:12:36

标签: regex string scala replace

我正在开发用于文本处理的Web应用程序。我需要将字符串(文本)分成单词和符号,例如空格和其他字符(逗号,点,分号,例如)每个单词和每个符号我需要包装到html标记中。每个标记都必须具有id属性,该属性在文本中包含单词(符号)序号。此处理将在Java Servlet中起作用,这意味着性能很重要。处方文本可能包含3000 - 5000个单词。

以下是输入示例:

One two three, four five six seven eight nine.

以下是示例输出:

<span id="w1" class="word">One </span><span id="w2" class="space">&nbsp;</span><span id="w3" class="word">two</span><span id="w4" class="space">&nbsp;</span><span id="w5" class="word">three</span><span id="w6" class="sign">,</span><span id="w7" class="space">&nbsp;</span><span id="w8" class="word">four</span><span id="w9" class="space">&nbsp;</span><span id="w10" class="word">five</span><span id="w11" class="space">&nbsp;</span><span id="w12" class="word">six</span><span id="w13" class="space">&nbsp;</span><span id="w14" class="word">seven</span><span id="w15" class="space">&nbsp;</span><span id="w16" class="word">eight </span><span id="w17" class="space">&nbsp;</span><span id="w18" class="word">nine</span><span id="w19" class="sign">.</span>

感谢所有人的建议,我怎么做。

更新:下面的代码按非字母数字符号拆分字符串

text.split("[^a-zA-Z0-9]")

和这段代码:

text.split("\\b[a-zA-Z0-9]+\\b")

按字词拆分字符串,但我不明白如何将正则表达式组合成单词和非字母数字符号?

UPDATE2:

好像是答案:

val text = "Hello from Scala - regex  world!"
val pattern = "[^a-zA-Z0-9|а-яА-Я0-9]|\\b[a-zA-Z0-9|а-яА-Я0-9]+\\b".r
pattern.findAllIn(text).matchData foreach {
  m => println("'" + m.group(0) + "'")
}

“|”之后的模式部分签署它是西里尔模式:

a-zA-Z0-9

1 个答案:

答案 0 :(得分:0)

我不能给你完整的代码,但如果能让你开始......我建议:

  1. 通过将字符串与

    匹配,将您的字符串“拆分”为您想要的字符组
    /\b[a-zA-Z]+\b|[^a-zA-Z]/g
    

    此正则表达式与\b[a-zA-Z]+\b的单词匹配,\b为单词边界,或[^a-zA-Z]任何其他非字母字符。你最终会得到一份比赛清单。

  2. 逐个浏览您的匹配项,通过递增ID并检查结果将结果包装到正确的标记中:

    • 如果第一个字符是空格,则class="space"
    • 如果第一个字符是字母,那么class="word"
    • else class="sign"
  3. 小心,第一个正则表达式会将...计为三个单独的字符,并将123计为三个分开的符号。您可以使用

    进行调整
    /\b[a-zA-Z]+\b|\b\d+\b|\.\.\.|[^a-zA-Z]/g
    

    并根据需要添加尽可能多的特殊情况,您就明白了。