如何仅匹配由点连接的单词?

时间:2014-09-16 05:39:41

标签: javascript regex

我想只匹配通过点连接到其他单词的单词。例如,在下面,我想匹配“两个”,“三个”,“四个”但“一个”:

//match only "two" "three" and "four"
.one .two.three.four

我该怎么做?

我尝试了这个,但它不起作用:

(\w+)((\.(([^\.]+\w)+))+)

3 个答案:

答案 0 :(得分:0)

你试过这个吗?

\S+\.\S+/i

这是一个可以轻松练习正则表达式的网站。 http://rubular.com/r/FguTt59e8E

答案 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中的正则表达式解决方案。

regex101 demo

一种可能的替代方法是匹配由点链接的每个字链,然后在点上分割......

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++;
}

jsfiddle demo