【问题标题】:Split sentence into separate words and the full-stop if at the end of sentence将句子分成单独的单词和句号如果在句末
【发布时间】:2014-05-28 00:24:06
【问题描述】:

我需要标记和处理基于编程语言的字符串。

例如,让我们使用以下字符串:

"      THE QUICK BROWN FOX    JUMPED-OVER THE LAZY(2) DOG." 

在 javascript 中,我可以执行以下操作将其拆分为一个数组:

var v = "      THE QUICK BROWN FOX   JUMPED-OVER THE LAZY(2) DOG.".match(/\S+/g);

这会产生以下数组:

["THE", "QUICK", "BROWN", "FOX", "JUMPED-OVER", "THE", "LAZY(2)", "DOG."]

如何更改匹配项的正则表达式以使句号成为单独的元素,从而产生以下输出:

["THE", "QUICK", "BROWN", "FOX", "JUMPED-OVER", "THE", "LAZY(2)", "DOG", "."]

请注意:

  • 我无法使用 \w,因为它会将 2 拆分为单独的标记,删除括号并删除句号。
  • 这不是一个重复的问题,因为其他关于拆分句子的问题在充分处理括号的同时没有处理句号问题。
  • 如果通过正则表达式无法做到这一点,那么是否可以从最后一个标记中删除句号,使最后一个标记变为“DOG”?

【问题讨论】:

  • '(', '2' 和 ')' 不是单独的标记吗?
  • @RobG 如果我要进行标记,我会标记所有内容,包括空格。
  • 我正在解析COBOL,所以我只对关键字感兴趣。我目前对空间不感兴趣(可能会改变)。
  • @JoeFrambach — 我想这取决于您对“令牌”的定义。空格不是tokens in ECMAScript(例如),但可能在其他上下文中。

标签: javascript regex text tokenize


【解决方案1】:

您可以匹配 \S 的取反函数并将 . 添加到类中,如下所示:

/[^\s.]+/g

结果给出:

"      THE QUICK BROWN FOX   JUMPED-OVER THE LAZY(2) DOG.".match(/[^\s.]+/g)
["THE", "QUICK", "BROWN", "FOX", "JUMPED-OVER", "THE", "LAZY(2)", "DOG"]

这只是从匹配中删除句点。

要为比赛添加一个结束时间段:

"      THE QUICK BROWN FOX   JUMPED-OVER THE LAZY(2) DOG.".match(/[^\s.]+|\.$/g)
["THE", "QUICK", "BROWN", "FOX", "JUMPED-OVER", "THE", "LAZY(2)", "DOG", "."]

【讨论】:

  • 谢谢乔,这正是我想要的,我真的需要坐下来学习正则表达式:-)
  • 我发现我需要支持单引号文本作为单个标记。我找到了以下正则表达式:.match(/('[^']+'|[^'\s]+)/g),它似乎可以工作,但如果它不在引号旁边,则在最后一行包含句号。
  • 我建议分两次执行此操作,而不是创建一个复杂的正则表达式。
【解决方案2】:

"."添加一个空格然后匹配它

var v = "      THE QUICK BROWN FOX   JUMPED-OVER THE LAZY(2) DOG.".replace(".", " .").match(/\S+/g);

console.log(v);

结果:

["THE", "QUICK", "BROWN", "FOX", "JUMPED-OVER", "THE", "LAZY(2)", "DOG", "."] 

【讨论】:

  • 我想过这个,但我想要一个只使用正则表达式的解决方案。不过谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多