正则表达式:标记分数数字,缩写和句子中的单词缩写形式

时间:2018-08-01 13:17:03

标签: javascript regex

我目前正在实现Javascript函数,将给定的句子标记为更简单的标记,从而根据英语将句子逐字分割。

我已经用JavaScript编写了regular expression/\\[^]|\.+|\w+|[^\w\s]/g

基于此,我尝试编写一个函数,该函数将一个句子作为输入并通过单词将其标记化并返回一个Javascript数组。

function TokenizeSentence(Sentence)
{
  let tokenizedSentence = new Array();
  let tokenizingRegex = /\\[^]|\.+|\w+|[^\w\s]/g;
  Sentence.replace(tokenizingRegex, (word, offset) => tokenizedSentence.push({
    word: word,
    start: offset,
    end: offset + word.length
  }));
  return tokenizedSentence;

}

let string = `Apply 1/2 day U.S.A leave as I'm away`;

console.log(TokenizeSentence(string));

我有一个例句:Apply 1/2 day leave as I'm away,我无法弄清楚如何将1/2I'm当作单个令牌而不是多个令牌。

我的问题是如何将1/2(一个小数)和I'm(一个简短的单词),U.S.A(一个缩写)当作一个单独的令牌?

2 个答案:

答案 0 :(得分:1)

您可以添加更具体的模式(例如\d+(?:\/\d+)+,以匹配1+个数字,后跟1+个/和1+个数字的序列,以及\b\w(?:\.\w)+\b,匹配单个单词char,后跟1个以上的.序列和一个单词char(整个单词)在更通用的序列之前,然后在其后添加一个可选的\w+组来“扩展” (?:'\w+)?

function TokenizeSentence(Sentence)
{
  let tokenizedSentence = new Array();
  let tokenizingRegex = /\\[^]|\.+|\d+(?:\/\d+)+|\b\w(?:\.\w)+\b|\w+(?:'\w+)?|[^\w\s]/g;
  Sentence.replace(tokenizingRegex, (word, offset) => tokenizedSentence.push({
    word: word,
    start: offset,
    end: offset + word.length
  }));
  return tokenizedSentence;

}

let string = `Apply 1/2 day U.S.A leave as I'm away`;

console.log(TokenizeSentence(string));

详细信息

  • \\[^]-任何转义的序列(\和任何字符)
  • |-或
  • \.+-1个或多个点
  • |-或
  • \d+(?:\/\d+)+-1个以上的数字,然后是1+个/的序列和1个以上的数字
  • |-或
  • \b\w(?:\.\w)+\b-一个单词边界,一个单词char,然后是一个点的1+序列,后跟1个单词char,然后是单词边界(如果您计划仅匹配ASCII大写字母,请替换{{1 }}和\w
  • [A-Z]-或
  • |-1个以上的字符字符,后跟\w+(?:'\w+)?和1个以上的字符字符的可选序列
  • '-或
  • |-除单词和空格字符外的任何字符。

答案 1 :(得分:1)

最适合您的示例的答案是用空格分隔结果:

(?<=^| )[^ ]*(?= |$)

这将返回“ Apply”,“ 1/2”,“ day”,“ leave”,“ as”,“ I'm”和“ away”。 但是,如果您有多个句子,这将不起作用。但是

  

以句子作为输入

应排除在外。

说明:

  1. (?<=^| )开头或空格后面的正向
  2. [^ ]*除空格以外的任何字符,0到无限次(贪婪)
  3. (?= |$)行尾或空格的正向超前