javascript - 每个起始字母只匹配一个单词

标签 javascript regex

你可以在这里看到我希望如何过滤单词:

string = 'Take all first words for each letter... this is a test';
first_letters = {};

words = string.match(/\w+/g);
words.forEach(function(x){
    var first = x[0].toLowerCase();
    first_letters[first] = (first_letters[first] || x);
});

result = [];
for (var x in first_letters) {
    result.push(first_letters[x]);
}

O.innerHTML = result;
<pre id=O>

我正在尝试仅使用正则表达式获取上面显示的数组 result,我开始尝试首先获取首字母:

result = words.match(/\b(?!\1)(\w)/gi);

但是 (?!\1) 并没有像我想象的那样过滤字母。可以看到here .

欢迎任何帮助。谢谢

最佳答案

此正则表达式将仅查找唯一的首字母:

r = /\b(\w)(?!.*\b\1)/gi;

这个正则表达式说:

Find the first letter after a word break, but only if that same letter does not occur immediately after a word break later in the string (negative lookahead).

string = 'Take all first words for each letter... this is a test';

> string.match(r)
< ["w", "f", "e", "l", "i", "a", "t"]

为每个唯一的第一个字母找到一个词:

r = /\b((\w)\w*)(?!.*\b\2)/gi

> string.match(r)
< ["words", "for", "each", "letter", "is", "a", "test"]

正如@karthik manchala 在评论中提到的,由于正则表达式的限制,这只会找到以每个字母开头的last 单词。要找到以每个字母开头的第一个 单词,您必须反转字符串中的单词:

> string . split(' ') . reverse() . join(' ') . match(r) . reverse()
< ["Take", "all", "first", "words", "each", "letter", "is"]

你的初始正则表达式

/\b(?!\1)(\w)/gi

无法正常运行,因为 \1 必须引用较早的捕获组。

关于javascript - 每个起始字母只匹配一个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36406915/

相关文章:

java - 基于逗号的分割线、奇怪的线

java - 使用正则表达式进行密码验证

javascript - 返回 tr 的引用

javascript - 无响应的 JavaScript 通知

javascript - 使用 jQuery 使用 CSS box-shadow 产生脉冲效果

Java 替换正则表达式不起作用

PHP 正则表达式将字符串解释为命令行属性/选项

java - 我应该在这里使用什么正则表达式?

javascript - 将 SVG 容器中最顶部的对象推到底部

javascript - 如何使用 jQuery 将类添加到基于子类的父元素