将文本拆分为单词而忽略单引号

时间:2014-02-15 06:37:03

标签: javascript regex

我正在尝试使用javascript的正则表达式从文本中获取单词但是收缩应该被视为单个单词:“不能”应该保持“不能”而不是“可以”和“t”。

我试过了:

var text = "I'd like to make it work."
var words = text.match(/\w+/g);

但它在“我”中无效。

如何将单引号作为单个单词处理,而不是两个单词?

4 个答案:

答案 0 :(得分:1)

另一种方法是做一个否定的比赛。您可以在字符类中添加不想匹配的内容。字符类^内的插入符[]被认为是否定操作符。

var text = "I'd like to make it work."
var words = text.match(/[^\s?!.]+/g);
console.log(words); // => [ 'I'd', 'like', 'to', 'make', 'it', 'work' ]

正则表达式:

[^\s?!.]+     any character except: whitespace (\n, \r, \t, \f, and " "), 
              '?', '!', '.' (1 or more times)

答案 1 :(得分:0)

var text = "I'd like to make it work."
var words = text.split(' ');

返回[“我”,“喜欢”,“转”,“制造”,“它”,“工作”。]

<强> EDITED

对不起,ChiChou的评论是正确的

var words = text.match(/[A-Za-z0-9_\']+/g);

它的工作方式与预期相同

答案 2 :(得分:0)

如果要匹配域和其他类似于点的对象,而不是连字符分隔符,则可以按如下方式修改@ hwnd的解决方案:

text.match(/[^*"\s?!\(\)]*[^*"\s?!.,\(\)]/g);

句点(例如,在句子末尾)不会包含在单词中,但像stackoverflow.com这样包含其中的点的字词将作为单个单词返回。

自动忽略双引号。单引号也可以被忽略,但只是失去了识别像'Tis(如'如此甜蜜以至于信任耶稣...... )或像学生'这样的所有权等词语的能力/ em>的。完美地解析所有单词需要在正则表达式的能力之外进行一些理解,但是在大多数情况下,这些解决方案中的任何一个都能很好地完成工作。

以下正则表达式对英语更有效,除非JavaScript不支持\w的语言环境,我会小心在任何可能的国际化语境中使用它。

/[^\s!"<>\(\)\[\]\{\}?`]*[\w']/g

(例如,它正确识别此答案中的每个单词,除了“eg”,它错误地认为尾随.是一个句点并忽略它。)

这个最终的RE也适用于任何语言:

[^\s!"<>\(\)\[\]\{\}?`]*[^\s!"<>\(\)\[\]\{\}?`.,:]

答案 3 :(得分:0)

尝试以下正则表达式:

/[\w']*[^\d\W]/g