Java REGEX для соответствия точному количеству цифр в строке - PullRequest
6 голосов
/ 09 марта 2012

Я пытался найти ответ на свою проблему в истории вопросов, но они просто возвращаются более чем через тысячу, и после сканирования нескольких десятков подходящих ответов я отказался. Итак, вот моя проблема.

Я хочу быть в состоянии найти первую последовательность из ровно шести цифр в строке. Учитывая строку «Некоторый текст 987654321 и еще один текст 123456 и еще один другой текст 654321 и еще один текст в конце» Я хочу найти регулярное выражение, которое будет соответствовать последовательности 123456.

Я новичок в регулярных выражениях, и краткое объяснение того, как это работает, очень поможет.

Заранее спасибо

Ответы [ 5 ]

13 голосов
/ 09 марта 2012

Вы можете использовать шаблон (?<!\d)\d{6}(?!\d), что означает «строковую позицию, которой не предшествует цифра; за ней следуют ровно шесть цифр; за ней следует строковая позиция, за которой не следует цифра». (Обозначение (?<!...), известное как отрицательное утверждение , означает «не предшествует ...». Обозначение (?!...), известное как отрицательное утверждение 1008 *, означает «не сопровождается ...». Обозначение \d означает цифру. Обозначение {n} означает « n раз», так что, например, \d{6} означает «шесть цифр».)

Это может выглядеть так:

final String number;
{
    final Matcher m = Pattern.compile("(?<!\\d)\\d{6}(?!\\d)").matcher(input);
    if(m.find())
        number = m.group(); // retrieve the matched substring
    else
        number = null; // no match found
}

Примечание: В предыдущей версии этого ответа предлагалось использовать границы слов, \b; но один из ваших комментариев предполагает, что цифрам могут предшествовать или следовать за ними традиционные китайские символы, которые считаются символами слова (и, следовательно, не приводят к появлению границы слова), поэтому я изменил это.

6 голосов
/ 09 марта 2012

Шаблон, который вы ищете:

(?x)              # enable comments
(?<! \p{Nd} )     # no decimal number before
\p{Nd} {6}        # exactly six repetitions of a decimal number
(?!= \p{Nd} )     # no decimal number after

Это также подберет такие вещи, как

U+FF10 ‭ 0 FULLWIDTH DIGIT ZERO
U+FF11 ‭ 1 FULLWIDTH DIGIT ONE
U+FF12 ‭ 2 FULLWIDTH DIGIT TWO
U+FF13 ‭ 3 FULLWIDTH DIGIT THREE
U+FF14 ‭ 4 FULLWIDTH DIGIT FOUR
U+FF15 ‭ 5 FULLWIDTH DIGIT FIVE
U+FF16 ‭ 6 FULLWIDTH DIGIT SIX
U+FF17 ‭ 7 FULLWIDTH DIGIT SEVEN
U+FF18 ‭ 8 FULLWIDTH DIGIT EIGHT
U+FF19 ‭ 9 FULLWIDTH DIGIT NINE

Если у вас есть те, что на китайском языке.

1 голос
/ 09 марта 2012
 public static String splitting(String str, int num){
    String arr[] = str.split("[^0-9]");
    for(String s:arr)
        if(s.length() == num)
            return s;
    return null;
}

тест с

 public static void main(String[] args) {
    String s =  "Some text 987654321 and some more text 123456 and some other text again 654321 and more text in the end";
    System.out.println(splitting(s, 6));
}

выход составляет

  123456
1 голос
/ 09 марта 2012

Первое вхождение 6 цифр в строке, которую вы разместили, на самом деле 987654.Если вы имеете в виду первое появление 6 цифр, окруженных символами, которые не являются цифрами, то это должно работать:

(?<!\d)(\d{6})(?!\d)

РЕДАКТИРОВАТЬ: Этот подход использует отрицательный взгляд назад и отрицательный взгляд вперед.Он немного отличается от подхода с использованием границ слов тем, что он будет соответствовать 123456 в следующих строках

123456asdf some text hello

another string a123456 aaaaaaaa

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

0 голосов
/ 07 мая 2016

в консоли Javascript это работает.Следите за \\d:

replacedString = "rx14ax145N".replace(RegExp("x14(?!\\d)", "g"), "___");

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