簡體   English   中英

正則表達式去除被視為字符串的前導零

[英]regex to strip leading zeros treated as string

我有這樣的數字需要刪除前導零。

這是我需要的:

00000004334300343 -> 4334300343

0003030435243 -> 3030435243

我無法弄清楚這一點,因為我是正則表達式的新手。 這不起作用:

(^0)

你快到了。 你只需要量詞:

str = str.replaceAll("^0+", "");

它替換了1個或多個0的出現(也就是+量詞的用途。類似地,我們有*量詞,意思是0或更多),在字符串的開頭(由插入符號給出 - ^ ),空字符串。

如果你知道輸入字符串都包含數字,那么你可以這樣做:

String s = "00000004334300343";
System.out.println(Long.valueOf(s));
// 4334300343

代碼演示

通過轉換為Long ,它將自動剝離所有前導零。

另一種解決方案(可能更直觀易讀)

str = str.replaceFirst("^0+", "");

^ - 匹配一行的開頭
0+ - 匹配零位字符一次或多次

你可以在這里找到一個令人筋疲力盡的模式列表模式

剝離前導零的正確正則表達式是

str = str.replaceAll("^0+", "");

此正則表達式將匹配字符串開頭的one and more數量中的0字符。 沒有理由擔心replaceAll方法,因為正則表達式具有^ (開始輸入)特殊字符,確保替換將僅被調用一次。

最終,您可以使用Java內置功能執行相同的操作:

String str = "00000004334300343";
long number = Long.parseLong(str);
// outputs 4334300343

前導零將自動為您剝離。

如果您需要從“00”獲得“0”,則接受的解決方案將失敗。 這是正確的:

str = str.replaceAll("0+(?!$)", "");

“^ 0 +(?!$)”表示如果未跟隨字符串結尾,則匹配一個或多個零。

\\b0+\\B將完成工作。 請參閱demo \\b將您的匹配錨定到單詞邊界,它匹配一個或多個零0+的序列,並且不在單詞邊界內完成(如果您只有00...000不能消除最后的0

我知道這是一個老問題,但我認為最好的方法實際上是

str = str.replaceAll("(^0+)?(\d+)", "$2")

我建議這樣做的原因是因為它將字符串分成兩組。 第二組至少是一位數字。 第一組匹配行首的 1 個或多個零。 但是,第一組是可選的,這意味着如果沒有前導零,您只需獲取所有數字。 並且,如果str只是一個零,你會得到一個零(因為第二組必須匹配至少一個數字)。

因此,如果它是任意數量的 0,您將得到正好一個零。 如果它以任意數量的 0 開頭,后跟任何其他數字,則不會出現前導零。 如果它以任何其他數字開頭,您將完全恢復您最初擁有的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM