我有一些像这样的字符串:
str1 = "00001011100000"; // 10111
str2 = "00011101000000"; // 11101
...
我想使用带有一次操作的正则表达式从每个字符串中去除前导和结束零。
到目前为止,我使用了两种不同的功能,但我想将它们组合在一起:
str.replace(/^0+/,'').replace(/0+$/,'');
答案 0 :(得分:18)
您可以使用OR
子句(|
)组合两个正则表达式:
var r = '00001011100000'.replace(/^0+|0+$/g, "");
//=> "10111"
更新:以上正则表达式解决方案用空字符串替换0
。要防止出现此问题,请使用此正则表达式:
var repl = str.replace(/^0+(\d)|(\d)0+$/gm, '$1$2');
RegEx分手:
^
:断言开始0+
:匹配一个或多个零(\d)
:后跟捕获组#1 |
:或(\d)
:匹配捕获组#2 0+
:后跟一个或多个零$
:断言结束<强>替换强>
这里我们使用两个捕获组的反向引用:
$1$2
这基本上在前导零和数字之后放置数字,然后在替换中尾随零。
答案 1 :(得分:0)
假设输入数据中始终至少有一位数字,您可以将此模式/^0*(\d+?)0*$/
与exec()
一起使用,并访问单个捕获组。
这只使用一个捕获组,没有替代品(管道),并确保输出中至少有一个数字,并且不会寻找多个匹配(没有g
)。
捕获组使用惰性量词,0
使用贪心量词来提高效率。开始和结束锚点(^
和$
)用于确保整个字符串匹配。
console.log('0001001000 => '+ /^0*(\d+?)0*$/.exec("00100100")[1]);
console.log('001 => ' + /^0*(\d+?)0*$/.exec("001")[1]);
console.log('100 => ' + /^0*(\d+?)0*$/.exec("100")[1]);
console.log('1 => ' + /^0*(\d+?)0*$/.exec("1")[1]);
console.log('0 => ' + /^0*(\d+?)0*$/.exec("0")[1]);
console.log('11 => ' + /^0*(\d+?)0*$/.exec("11")[1]);
console.log('00 => ' + /^0*(\d+?)0*$/.exec("00")[1]);
console.log('111 => ' + /^0*(\d+?)0*$/.exec("111")[1]);
console.log('000 => ' + /^0*(\d+?)0*$/.exec("000")[1]);
&#13;
或者您可以将作业的一半转移到+
以将字符串转换为int(这样可以在没有长度时稳定输入),然后让replace
处理右侧修整。
一次性lookbehind((?<=\d)
)用于确保最小输出长度为1。
console.log('0001001000 => ' + (+'0001001000'.replace(/(?<=\d)0*$/, "")));
console.log('[empty] => ' + (+''.replace(/(?<=\d)0*$/, "")));
console.log('001 => ' + (+'001'.replace(/(?<=\d)0*$/, "")));
console.log('100 => ' + (+'100'.replace(/(?<=\d)0*$/, "")));
console.log('1 => ' + (+'1'.replace(/(?<=\d)0*$/, "")));
console.log('0 => ' + (+'0'.replace(/(?<=\d)0*$/, "")));
console.log('11 => ' + (+'11'.replace(/(?<=\d)0*$/, "")));
console.log('00 => ' + (+'00'.replace(/(?<=\d)0*$/, "")));
console.log('111 => ' + (+'111'.replace(/(?<=\d)0*$/, "")));
console.log('000 => ' + (+'000'.replace(/(?<=\d)0*$/, "")));
&#13;