单个regexp中的重组捕获组?

时间:2017-07-09 13:54:17

标签: javascript regex

我正在尝试处理类似于:

的输入组

'...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"

1 个答案:

答案 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);

当然,这非常难看。 : - )