我想只匹配通过点连接到其他单词的单词。例如,在下面,我想匹配“两个”,“三个”,“四个”但不“一个”:
//match only "two" "three" and "four"
.one .two.three.four
我该怎么做?
我尝试了这个,但它不起作用:
(\w+)((\.(([^\.]+\w)+))+)
答案 0 :(得分:0)
答案 1 :(得分:0)
(?<=\.)(\w+)(?=\.\w+)|(?<=\w\.)(\w+)|(?<=\s)(\w+)(?=\.\w+)
试试这个。看看演示。
http://regex101.com/r/jT3pG3/20
仅限js,因为不支持lookbehind
(?=\.(\w+)\.\w+)|(?=\s(\w+)\.\w+)|(?=\w\.(\w+)\b)
参见演示。
http://regex101.com/r/jT3pG3/22
只需删除重复的结果,因为某些组可能满足多于1个条件。
答案 2 :(得分:0)
你可以使用这个较短的正则表达式,如果要求只是单词与一个点相关联(即在单词链的第一个单词之前不需要初始点):
(?=(\b\w+\b)(?=\.(\w+\b)(?!\.)|\.\w+))
也不提供重复匹配;所以不需要过滤;你只需要检查第一和第二个子匹配。第一个子匹配将包含大部分单词,而第二个子匹配将包含链的最后一个单词。
大量使用前瞻,但我认为没有JS中的正则表达式解决方案。
一种可能的替代方法是匹配由点链接的每个字链,然后在点上分割......
var s = ".one .two.three.four .one. one.two";
var reg = /\b\w+(?:\.\w+)+\b/g;
var count = 0
while ((m = reg.exec(s)) != null) {
var words = m[0].split(".");
console.log("Word chain " + count + ": " + words.join(",") + "\n");
count++;
}