[英]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.