Regex положительный взгляд за беды - PullRequest
3 голосов
/ 02 марта 2012

Моя цель - сопоставить первые 0 и все после этого нуля в десятичном виде. Если первое десятичное место равно нулю, то я тоже хочу сопоставить десятичное число. Если десятичной дроби нет, то ничего не запишите.

Вот несколько примеров того, что я хочу:

180.570123 // should capture the "0123" on the end
180.570    // should capture the "0" on the end
180.0123   // should capture the ".0123" on the end
180.0      // should capture the ".0" on the end
180123     // should capture nothing
180        // should capture nothing

Если первое десятичное место равно 0, то сопоставление легко:

(\.0.*)

Моя проблема совпадает, когда первый десятичный знак не равен 0. Я верю, что позитивный взгляд решит эту проблему, но я не могу заставить его работать правильно. Вот одно из регулярных выражений, которое я пробовал:

(?<=^.*\..*)0.*

Это регулярное выражение в конечном итоге будет использоваться в Java.

UPDATE

Я собираюсь использовать это регулярное выражение, чтобы избавиться от чисел и, возможно, десятичной точки в конце строки, используя Java replaceAll метод. Я сделаю это, заменив группу захвата пустой строкой. Вот лучший пример того, что я хочу.

String case1 = "180.570123";
String case2 = "180.570";
String case3 = "180.0123";
String case4 = "180.0";
String case5 = "180123";
String case6 = "180";

String result = null;

result = case1.replaceAll( "THE REGEX I NEED", "" );
System.out.println( result ); // should print 180.57

result = case2.replaceAll( "THE REGEX I NEED", "" );
System.out.println( result ); // should print 180.57

result = case3.replaceAll( "THE REGEX I NEED", "" );
System.out.println( result ); // should print 180

result = case4.replaceAll( "THE REGEX I NEED", "" );
System.out.println( result ); // should print 180

result = case5.replaceAll( "THE REGEX I NEED", "" );
System.out.println( result ); // should print 180123

result = case6.replaceAll( "THE REGEX I NEED", "" );
System.out.println( result ); // should print 180

Кроме того, я проверяю эти регулярные выражения в http://gskinner.com/RegExr/

Ответы [ 4 ]

3 голосов
/ 02 марта 2012

Вы можете использовать это выражение:

\.[1-9]*(0\d*)

И то, что вы хотите, будет в первой группе захвата.(За исключением десятичной точки.)

Если вы также хотите записать десятичную точку, вы можете использовать:

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

Пример ( онлайн ):

Pattern p = Pattern.compile("(?:\\.[1-9]+|(?=\\.))(\\.?0\\d*)");

String[] strs = {"180.570123", "180.570", "180.0123", "180.0", "180123", "180", "180.2030405"};

for (String s : strs) {
    Matcher m = p.matcher(s);
    System.out.printf("%-12s: Match: %s%n", s,
        m.find() ? m.group(1) : "n/a");
}

Вывод:

180.570123  : Match: 0123
180.570     : Match: 0
180.0123    : Match: .0123
180.0       : Match: .0
180123      : Match: n/a
180         : Match: n/a
180.2030405 : Match: 030405
1 голос
/ 02 марта 2012

Я бы написал небольшую функцию для извлечения вместо регулярного выражения.

private String getZeroPart(final String s) {
        final String[] strs = s.split("\\.");
        if (strs.length != 2 || strs[1].indexOf("0") < 0) {
            return null;
        } else {
            return strs[1].startsWith("0") ? "." + strs[1] : strs[1].substring(strs[1].indexOf("0"));
        }
    }

для проверки:

final String[] ss = { "180.570123", "180.570", "180.0123", 
"180.0", "180123", "180", "180.2030405","180.5555" };

        for (final String s : ss) {
            System.out.println(getZeroPart(s));
        }

вывод:

0123
0
.0123
.0
null
null
030405
null

обновление

на основе РЕДАКТИРОВАНИЯ вопроса.выполните некоторые изменения в методе, чтобы получить правильный номер:

private String cutZeroPart(final String s) {
    final String[] strs = s.split("\\.");
    if (strs.length != 2 || strs[1].indexOf("0") < 0) {
        return s;
    } else {
        return strs[1].startsWith("0") ? strs[0] : s.substring(0, strs[0].length() + strs[1].indexOf("0") + 1);
    }
}

вывод:

180.570123 -> 180.57
180.570 -> 180.57
180.0123 -> 180
180.0 -> 180
180123 -> 180123
180 -> 180
180.2030405 -> 180.2
180.5555 -> 180.5555
0 голосов
/ 02 марта 2012

Вы можете попробовать это:

        Matcher m = Pattern.compile("(?<=(\\.))(\\d*?)(0.*)").matcher("180.2030405");
        String res="";
        if(m.find()){
            if(m.group(2).equals("")){
                res = "."+m.group(3);
            }
            else{
                res = m.group(3);
            }
        }
0 голосов
/ 02 марта 2012

Взгляд может быть излишним. Этот работал хорошо ->

/\.\d*(0\d*)/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...