Регулярное выражение Java для идентификации строк с большим количеством цифр, чем не-цифр - PullRequest
1 голос
/ 25 мая 2009

Как я могу идентифицировать строки, содержащие больше цифр, чем не-цифр, используя регулярное выражение (Pattern) в Java? Спасибо.

Ответы [ 6 ]

12 голосов
/ 25 мая 2009

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

public static boolean moreDigitsThanNonDigits(String s) {
    int diff = 0;
    for(int i = 0; i < s.length(); ++i) {
        if(Character.isDigit(s.charAt(i))) ++diff;
        else --diff;
    }
    return diff > 0;
}
10 голосов
/ 25 мая 2009

Вы не сможете написать регулярное выражение, которое делает это. Но вы уже сказали, что используете Java, почему бы не смешать немного кода?

public boolean moreDigitsThanNonDigits(String input) {
    String nonDigits = input.replace("[0-9]","");
    return input.length() > (nonDigits.length * 2);
}
3 голосов
/ 26 мая 2009

Регулярные выражения концептуально не способны выполнить такую ​​задачу. Они эквивалентны формальным языкам или (обычным) автоматам. У них нет понятия памяти (или стека), поэтому они не могут сосчитать количество символов. Следующим расширением с точки зрения выразительности являются автоматы сжатия (или стековые машины), которые соответствуют грамматикам без контекста. Перед написанием такого грамматического кода для этой задачи целесообразно использовать метод, подобный приведенному выше moreDigitsThanNonDigits.

1 голос
/ 19 ноября 2010

Как уже упоминалось, рассматриваемый язык не является регулярным и не может быть обнаружен с помощью регулярного выражения.

Я дам вам еще один способ подсчета количества цифр и количества не цифр в строке с помощью регулярных выражений !!

Вы можете использовать метод String.replaceAll, чтобы удалить все нецифровые символы во входной строке. Длина результирующей строки будет количеством цифр на входе.

Точно так же вы можете удалить все цифры во входной строке, а длина результирующей строки будет числом не цифр во входной строке.

public static boolean test(String str) {
         int numDigits = str.replaceAll("\\D","").length();
         int numNonDigits = str.replaceAll("\\d","").length();

         return numDigits > numNonDigits;
}

Ideone Link

0 голосов
/ 25 мая 2009

регулярное выражение само по себе не может (так как они ничего не считают); но если вы хотите использовать их, просто используйте две замены: одну, которая удаляет все цифры, и одну, которая только сохраняет их. затем сравните длины строк результатов.

Конечно, я бы предпочел использовать ответ Дейва.

0 голосов
/ 25 мая 2009

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

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