我正在尝试处理类似于以下内容的输入组:
'...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"

最佳答案

如果目标是将所有.移至开头并将所有A-Z移至结尾,那么我相信答案是



没有。”

另外,我认为没有比两个replace调用更简单,更有效的方法了-但是您所展示的两个没有。代替:

var str = "...A..B...C.";
var result = str.replace(/[A-Z]/g, "") + str.replace(/\./g, "");
console.log(result);


(我不知道您想对non- .和non- A-Z字符做什么,所以我忽略了它们。)

如果您确实想通过单次调用replace来做到这一点(例如,单次传递字符串很重要),就可以,但是我很确定您必须使用函数回调和状态变量:

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


那当然是令人难以置信的丑陋。 :-)

关于javascript - 将捕获组合并到单个正则表达式中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44997143/

10-09 16:53