正则表达式匹配除第一次出现以外的所有

时间:2016-02-15 16:10:25

标签: javascript regex

我需要一个正则表达式来匹配除第一个点之外的所有点(。)。

例如,如果来源是:  aaa.bbb.ccc..ddd

表达式应与bbb和ccc之后的点匹配,但不能与aaa之后的点匹配。在其他作品中,它应匹配除第一个点以外的所有点。

我需要javascript正则表达式。

2 个答案:

答案 0 :(得分:5)

使用pcre(PHP,R)你可以这样做:

\G(?:\A[^.]*\.)?+[^.]*\K\.

https://github.com/apache/cordova-plugin-media-capture

细节:

\G # anchor for the start of the string or the position after a previous match
(?:\A[^.]*\.)?+ # start of the string (optional possessive quantifier)
[^.]* # all that is not a dot
\K    # remove all that has been matched on the left from the match result
\.    # the literal dot

使用.net:(因为你可以使用可变长度的lookbehind很容易)

(?<!^[^.]*)\.

demo

使用javascript无法使用单一模式执行此操作。

使用占位符:

var result = s.replace('.', 'PLACEHOLDER')
              .replace(/\./g, '|')
              .replace('PLACEHOLDER', '.');

(或用|替换所有点,然后用点代替第一次出现的|

使用split:

var parts = s.split('.');
var result = parts.shift() + (parts.length ? '.': '') + parts.join('|');

带一个柜台:

var counter=0;
var result = s.replace(/\./g, function(_){return counter++ ? '|':'.';});

答案 1 :(得分:4)

使用箭头功能(ES6)的JavaScript一线解决方案:

'aaa.bbb.ccc..ddd'
   .replace(/\./g, (c, i, text) => text.indexOf(c) === i ? c : '|')

-> 'aaa.bbb|ccc||ddd'