你可以在这里看到我希望如何过滤单词:
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/