用于删除紧跟在非数字后面的零的正则表达式

regular expression for deleting zeros that come immediately after a non-digit

本文关键字:正则表达式 数字 删除 用于      更新时间:2023-09-26

我正在编写代码,将以千计的数字(在写作中以3块为单位分隔)转换为用于日语格式的无数个数字(在书写中以4块为单位分割)。

当前代码产生以下结果:
ex)
输入:123,456,789,123,456
输出:123兆4567億8912万3456

使用正则表达式,我已经能够删除四个0的序列和myriad = myriad.replace(/0000'D/g, "");的过程字符
结果:
输入:12,300,002,345
输出:123億2345(删除了0000万

然而,该代码目前并没有删除不必要的零:
ex)
输入:32,131,200,232,132
输出:32兆1312億0023万2132

(我想删除23万之前的两个零)

我正试图找到一个正则表达式解决方案,并尝试使用
myriad = myriad.replace(/?=0{1,3}/g, "");,但没有成功。。。我很困惑,任何建议都会对有所帮助

编辑:我认为正则表达式应该替换任何''D后面的0,但我不知道如何在不删除前面的字符以及的情况下删除它们

编辑:工作应用程序:

<!DOCTYPE html>
<html>
  <head>
   <title>変換天才</title>
   
	<script>
	
	//myriad converter function help from Stack Overflow user paxdiablo
	function makeNum(num) {
   	num = num.replace(/,/g,"");  		  //remove commas
   	var markers = "万億兆京該秭穣溝澗正載極";
   	var result = "";
	//regroup in myriads
   	while (num.length > 4) {
        if (markers.length == 0) {
            result = "(?)" + num.substr(num.length-4) + result;
        } else {
            result = markers.substr(0, 1) + num.substr(num.length-4) + result;
            markers = markers.substr(1);
        }
        num = num.substr(0, num.length-4);
  	}
   	 return num + result;
	}
	//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
	// insert commas for readability
	//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
	function makeCom(num){
	  num = num.replace(/,/g, "");
	
	  var result = num.replace(/('d)(?=('d'd'd)+(?!'d))/g, "$1,");
	  return result;
	}
	function convert(){
	
	var innum = document.getElementById("input").value;
	var parsnum = (innum.replace(/,/g,""));
	if (isNaN(parseInt(parsnum)) == true) {
	document.getElementById("converted").innerHTML = "Please enter valid number.";
	}
	else {
	var myriad = makeNum(innum);
	// delete unnec. zeros 
	myriad = myriad.replace(/0000'D/g, "");
	myriad = myriad.replace(/('D)0+/g, "$1");
	document.getElementById("converted").innerHTML = myriad ;
	
	//display number with commas
	var commanum = makeCom(innum);
	document.getElementById("commaed").innerHTML = "You entered: " + commanum ;
	
	  }
	}
	
	
	//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
	// button functions
	//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
	
	function multiplier(kake) {
	 var mult = document.getElementById("input").value;
	
	  if (mult == "") {
	   mult = kake;
		}
	  else if (isNaN(mult)==false){
	   mult = (mult * kake);
		}
	  else {
	   document.getElementById("converted").innerHTML = "Please enter valid number";
	   return;
		}
	  document.getElementById("input").value = mult; 
	}
	function thou(){
	 multiplier(1000);
	 }
	function xMil(){
	 multiplier(1000000);
	}
	function xBil(){
	 multiplier(1000000000);
	}
	function xTril(){
	 multiplier(1000000000000);
	}
	function xQuad(){
	 multiplier(1000000000000000);
	} 	
	function clr(){
	document.getElementById("input").value = "";
	document.getElementById("converted").innerHTML = "";
	}
	
	</script>
  </head>
  <body>
	<div><p>Enter a large whole number (commas OK). </p></div>
	<input type="text" id="input"/>
	<input type="submit" id="submit" value="Convert" onclick="convert()">
	<br>
	<input type="button" id="xthou" onclick="thou()" value="thousand">
	<input type="button" id="xmil" onclick="xMil()" value="million">
	<input type="button" id="xbil" onclick="xBil()" value="billion">
	<br>
	<input type="button" id="xtril" onclick="xTril()" value="trillion">
	<input type="button" id="xquad" onclick="xQuad()" value="quadrillion">
	<input type="button" id="clr" onclick="clr()" value="Clr"> 
	<br><br>
	<div><span id="commaed"></span></div>
	<br>
	<div id="converted"></div>
  </body>
</html>

您需要使用捕获组。

string.replace(/('D)0+/g, "$1")

('D)捕获一个非数字字符,随后的0+将匹配一个或多个0。将匹配的字符替换为组索引1中的字符将获得所需的输出。

我发现regex fiddles对这类事情非常有用。我在这里做了一个:https://regex101.com/r/jG3aB5/1

我认为将解决您的问题的正则表达式是这样的:

(?:[^0-9])*(0*)

它匹配单个非数字字符后面任意数量的零。非数字字符不会被捕获,也不会被替换。

另一种方法:使用lookbacking不包括匹配字符'D,而只匹配零。请参阅正在运行的演示

/(?!'D)0+/g

在您的情况下:

myriad = myriad.replace(/(?!'D)0+/g, "");