我正在尝试处理类似于:
的输入组 '...A.B.'
并希望输出'.....AB'
。
另一个例子:
'.C..Z..B.' ==> '......CZB'
我一直在使用以下内容:
'...A.B.'.replace(/(\.*)([A-Z]*)/g, "$1")
返回:
"....."
和
'...A.B.'.replace(/(\.*)([A-Z]*)/g, "$2")
返回:
"AB"
但
'...A.B.'.replace(/(\.*)([A-Z]*)/g, "$1$2")
返回
"...A.B."
有没有办法返回
"....AB"
只有一个正则表达式?
我只能通过以下方式实现这一目标:
'...A.B.'.replace(/(\.*)([A-Z]*)/g, "$1") + '...A.B.'.replace(/(\.*)([A-Z]*)/g, "$2")
==> ".....AB"
答案 0 :(得分:1)
如果目标是将所有.
移至开头,将所有A-Z
移至最后,那么我相信
只有一个正则表达式?
是“不。”
另外,我认为没有比两个replace
电话更简单,更有效的方式 - 但不是你所展示的两种方式。代替:
var str = "...A..B...C.";
var result = str.replace(/[A-Z]/g, "") + str.replace(/\./g, "");
console.log(result);
(我不知道你想对非.
,非A-Z
字符做什么,所以我忽略了它们。)
如果真的希望通过一次调用replace
来做到这一点(例如,通过字符串重复一次),你可以,但我很确定你' d必须使用函数回调和状态变量:
var str = "...A..B...C.";
var dots = "";
var nondots = "";
var result = str.replace(/\.|[A-Z]|$/g, function(m) {
if (!m) {
// Matched the end of input; return the
// strings we've been building up
return dots + nondots;
}
// Matched a dot or letter, add to relevant
// string and return nothing
if (m === ".") {
dots += m;
} else {
nondots += m;
}
return "";
});
console.log(result);
当然,这非常难看。 : - )