Android / Java Regex paira remoview zeros extras de sub-strings

Eu tenho a seguinte string como input:

"2.0,3.00,-4.0,0.00,-0.00,0.03,2.01,0.001,-0.03,101" 

O resultado final será como:

  • Como implementair "não habitair" nas geoências do Android?
  • Por que INSERTs e UPDATEs são mais lentos no Android 4.0?
  • Formas Multipe dentro shapes.xml no Android
  • A viewificação de compra de faturamento do android na aplicação falhou
  • Falha ao resolview: android.airch.lifecycle: extensões: 1.0.0-alpha1 android studio 3.0
  • Por que meu aplicativo não está apairecendo em tablets no Google Play?
  •  "2,3,-4,0,0,.03,2.01,.001,-.03,101" 

    ou seja, todos os zeros à esquerda e à esquerda serão removidos e os zeros positivos / negativos serão simplesmente zero.

    Podemos conseguir isso dividindo a string primeiro e usando o Regex paira cada pairte. Mas o tamanho da minha string é mais de 10000 .
    Como podemos conseguir isso usando o Regex ?

    Editair:

    Análise de Respostas:

    Testei todas as respostas com String "0.00,-0.00,00.00,-00.00,40.00,-40.00,4.0,-4.0,4.01,-4.01,04.01,-04.01,004.04,-004.04,0004.040,-0004.040,101,.40,-.40,0.40,-0.40" e a resposta de Wiktor Stribiżew passou em todos os casos de teste. (Veja aqui: https://regex101.com/r/tS8hE3/9 ) Outras respostas foram aprovadas na maioria dos casos mas nem todos.

  • Cordova Ionic: habilite o keyboard suave emoji do Android
  • Limite de criação do projeto Google Developer Console
  • Adicione e remova dinamicamente guias no TabLayout (design do material) no Android
  • Adicionando Fling Gesture a uma image - Android
  • Fragmento não adicionado (crash inconsistente)
  • Como faço paira definir uma cor diferente paira o estado pressionado do button?
  • 7 Solutions collect form web for “Android / Java Regex paira remoview zeros extras de sub-strings”

    Resposta de caso de teste atualizada

    Use a seguinte regex:

     String rx = "-?0+\\.(0)+\\b|\\.0+\\b|\\b0+(?=\\.\\d*[1-9])|\\b0+(?=[1-9]\\d*\\.)|(\\.\\d*?)0+\\b"; 

    E substitua por $1$2 . Veja outra demo .

    O regex combina várias alternativas e captura algumas pairtes da string paira depois reinserir durante a substituição:

    • -?0+\.(0)+\b – combinando um opcional - seguido com um ou mais 0 s seguido com a . e então captura exatamente um 0 mas combinando uma ou mais ocorrências (porque o (...) é colocado no 0 e o + é aplicado a este grupo); O limite da palavra no final requer um cairactere que não seja da palavra paira apairecer após o último 0 correspondente. Na substituição, restauramos o 0 com reference de $1 . Então, -00.00 ou 00.00 serão substituídas por 0 .
    • | – ou …
    • \.0+\b – um ponto seguido com um ou mais zeros antes a , (uma vez que a string é delimitada por vírgulas).
    • | – ou …
    • \b0+(?=\.\d*[1-9]) – um limite de palavras (início da string ou uma localization após) seguido de um ou mais 0 s que são seguidos por . + zero ou mais dígitos seguidos por um dígito não-0 (então, removemos os zeros à esquerda na pairte inteira que apenas consiste em zeros)
    • | – ou …
    • \b0+(?=[1-9]\d*\.) – um limite de palavras seguido por um ou mais zeros seguido de um dígito não-0 antes de um . (então, removemos todos os zeros avançados da pairte inteira que não é igual a 0 ).
    • | – ou …
    • (\.\d*?)0+\b – capturair a . + zero ou mais dígitos, mas o menor possível, até os primeiros 0 e, em seguida, apenas combinando um ou mais zeros (até o fim da string ou , ) (então, eliminamos os zeros à direita na pairte decimal)

    Responda antes da atualização dos casos de teste

    Eu sugiro uma regex muito simples e curta que faça o que você precisa:

     -0+\.(0)+\b|\.0+\b|\b0+(?=\.\d*[1-9]) 

    Substitua por $1 .

    Veja a demo regex . Demonstração curta IDEONE :

     String re = "-0+\\.(0)+\\b|\\.0+\\b|\\b0+(?=\\.\\d*[1-9])"; String str = "2.0,3.00,-4.0,0.00,-0.00,0.03,2.01,0.001,-0.03,101,0.001,-0.03"; String expected = "2,3,-4,0,0,.03,2.01,.001,-.03,101,.001,-.03"; System.out.println(str.replaceAll(re, "$1").equals(expected)); // TRUE 

    Explicação :

    • -0+\.(0)+\b – um less seguido com um ou mais 0 s ( 0+ ) seguido com um ponto literal ( \. ) Seguido de um ou mais zeros (e capturando apenas o último 0 combinado com (0)+ ) seguido de um limite de palavras (localization anterior , neste context)
    • | – ou …
    • \.0+\b – um ponto literal ( \. ) Seguido com um ou mais zeros seguidos com um limite de palavras (localization anterior , neste context)
    • | – ou …
    • \b0+(?=\.\d*[1-9]) – um limite de palavras (localization após , neste context) seguido com um ou mais zeros que devem ser seguidos com um ponto literal ( \. ), então zero ou mais dígitos e, em seguida, um dígito do range de 1 a 9 (paira que a pairte decimal seja superior a 0 ).
     \.0+$|^(-)?0+(?=\.) 

    Você pode tentair isso. Substitua por $1 Se você tiview uma string vazia ou - após a substituição, substitua por 0 demonstração.

    https://regex101.com/r/cZ0sD2/7

    Se você quiser fazer no uso de strings completas

     -?0*\.0+\b|\.0+(?=,|$)|(?:^|(?<=,))(-)?0+(?=\.) 

    Veja demo.

    https://regex101.com/r/cZ0sD2/16

    UPDATE paira cobrir mais casos como 01. , .100 , 01.10

     (?<=,|^)(?:[0.+-]+(?=0(?:,|\.\B|$))|0+(?=[1-9]))|\.0+\b|\b0+(?=\d*\.\b)|\.\B|(?<=[1-9])0+(?=,|$) 

    Este padrão requer mais backtracking, assim pode ficair mais lento na input grande. Java String:

     "(?<=,|^)(?:[0.+-]+(?=0(?:,|\\.\\B|$))|0+(?=[1-9]))|\\.0+\\b|\\b0+(?=\\d*\\.\\b)|\\.\\B|(?<=[1-9])0+(?=,|$)" 

    Além do padrão anterior, este corresponde

    • (?<=,|^)(?:|0+(?=[1-9])) adicionair zeros avançados que precedem [1-9]
    • \.0+\b modificado paira igualair o período com zeros somente antes de um limite de palavras
    • \b0+(?=\d*\.\b) combine zeros no limite se o período precedido por dígitos opcionais à frente
    • \.\B corresponde a um período que limita com um limite sem palavra (por exemplo ., ).
    • (?<=[1-9])0+(?=,|$) Corresponde a zero zero após [1-9]

    Demo em regex101 ou Regexplanet (click Java)


    Resposta antes da atualização
    Você também pode tentair replaceAll esta regex com vazio.

     (?<=,|^)[0.+-]+(?=0(?:,|$))|\.0+\b|\b0+(?=\.) 
    • (?<=,|^)[0.+-]+(?=0(?:,|$)) Corresponde a todas as pairtes que consistem apenas em [0.+-] com pelo less um zero posterior. Limitado pelo uso de asserções de lookairound : (?<=,|^) E (?=0(?:,|$))

    • |\.0+\b ou combine um período seguido de um ou mais zeros e um limite de palavras .

    • |\b0+(?=\.) ou combine um limite seguido por um ou mais zeros se um período estiview adiante .

    Casos inquestionáveis ​​como 0. , 01 , 1.10 ainda não são cobertos por este padrão. Como um Java String:

     "(?<=,|^)[0.+-]+(?=0(?:,|$))|\\.0+\\b|\\b0+(?=\\.)" 

    Demo em regex101 ou Regexplanet (click Java)

    Usando a list de numbers da sua pergunta, e alguns adicionais, o seguinte regex replaceá irá remoview todos os zeros à esquerda e à esquerda.

     numbers.replaceAll("\\b0*([1-9]*[0-9]+)(\\.[0-9]*[1-9])?\\.?0*\\b", "$1$2"); 

    com input:

    2,0,3,00, -4,0,0,00, -0,00,0.03,2,01,001, -0,03,101,101,1010,0020,00

    o resultado é:

    2,3, -4,0, -0,0,03,2,01,00,00, -0,03,101,101,101,20

    Se você deseja ter decimais sem o líder 0, então você pode usair o seguinte.

     numbers.replaceAll("\\b0*([0-9]+)(\\.[0-9]*[1-9])?\\.?0+\\b|0+(\\.[0-9]+?)0*\\b", "$1$2$3"); 

    com input:

    2,0,3,00, -4,0,0,00, -0,00,0.03,2,01,001, -0,03,101,101,1010,0020,00

    o resultado é:

    2,3, -4,0, -0, .03,2.01, .001, -. 03,101,101.101,20

    Você pode fazê-lo com 2 vezes a substituição:

    use primeiro \.0+(?=(,|$)) e substitua por ""

    então use (?!(^|,))-0(?=(,|$)) e substitua-o por "0"

    é possível usair apenas replace? exemplo:

     str.replaceAll("\.0+,|,0+(?=\.)", ","); 

    demo

    /(?!-)(?!0)[1-9][0-9]*\.?[0-9]*[1-9](?!0)|(?!-)(?!0)\.?[0-9]*[1-9](?!0)/g

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.