Regex требуется для строк с разделителями-пробелами java

У меня есть операция, которая имеет дело со многими строками с разделителями-пробелами, я ищу регулярное выражение для функции совпадений строк, которая вызовет пропуск, если первые две строки до первого пробела начинаются с заглавных букв, и вернет false, если это не так.

Примеры:

"AL_RIT_121 PA_YT_32 rit cell 22 pulse"

вернет true, так как первые две подстроки AL_RIT_121 и PA_YT_32 начинаются с заглавной буквы A и P соответственно.

"AL_RIT_252 pa_YT_21 mal cell reg 32 1 ri"

вернет false, так как p в нижнем регистре.


person Avishek    schedule 19.11.2012    source источник
comment
твой вопрос не имеет смысла. ваш первый пробел между AL_RIT_121 и PA_YT_32   -  person Sam I am says Reinstate Monica    schedule 19.11.2012


Ответы (5)


Просто string.matches("[A-Z]\\w+ [A-Z].*")

person Orabîg    schedule 19.11.2012
comment
Спасибо за выкройку, она соответствует моим критериям :) - person Avishek; 20.11.2012

Pattern.compile("^\\p{Lu}\\S*\\s+\\p{Lu}")

будет работать с методом .find(). Нет причин использовать matches в тесте префикса, но если у вас есть внешнее ограничение, просто выполните

Pattern.compile("^\\p{Lu}\\S*\\s+\\p{Lu}.*", Pattern.DOTALL)

Чтобы разбить это:

  1. ^ соответствует началу строки,
  2. \\p{Lu} соответствует любой заглавной букве,
  3. \\S* соответствует нулю или более не пробельным символам, включая _
  4. \\s+ соответствует одному или нескольким символам пробела, и
  5. второй \\p{Lu} соответствует заглавной букве, начинающейся со второго слова.

Во втором варианте .* в сочетании с Pattern.DOTALL соответствует остальной части ввода.

person Mike Samuel    schedule 19.11.2012
comment
Вам не обязательно заключать \p{Lu} в квадратные скобки; как \s и \S, он может стоять отдельно. И это DOTALL, а не DOT_ALL. Мне почти всегда приходится искать это, как в Python, так и в Java, но они оба пишутся без подчеркивания. - person Alan Moore; 20.11.2012
comment
Большое спасибо всем вам, предоставленное регулярное выражение отлично сработало для меня :) - person Avishek; 20.11.2012

Вы можете использовать конкретное регулярное выражение, если эти два примера демонстрируют ваш формат ввода:

^(?:[A-Z]+_[A-Z]+_\d+\s*)+

Что значит:

^           - Match the beginning of the string
(?:         - Start a non-capturing group (used to repeat the following)
    [A-Z]+  - Match one or more uppercase characters
    _       - Match an underscore
    [A-Z]+  - Match one or more uppercase characters
    _       - Match an underscore
    \d+     - Match one or more decimals (0-9)
    \s*     - Match zero or more space characters
)+          - Repeat the above group one or more times

Вы бы использовали его в Java следующим образом:

Pattern pattern = Pattern.compile("^(?:[A-Z]+_[A-Z]+_\\d+\\s*)+");
Matcher matcher = p.matcher( inputString);
if( matcher.matches()) {
    System.out.println( "Match found.");
}
person nickb    schedule 19.11.2012

Проверь это:

    public static void main(String[] args) 
{
    String text = "AL_RIT_121 pA_YT_32 rit cell 22 pulse";

    boolean areFirstTwoWordsCapitalized = areFirstTwoWordsCapitalized(text);

    System.out.println("areFirstTwoWordsCapitalized = <" + areFirstTwoWordsCapitalized + ">");

}

private static boolean areFirstTwoWordsCapitalized(String text)
{
    boolean rslt = false;

    String[] words = text.split("\\s");

    int wordIndx = 0;

    boolean frstWordCap = false;
    boolean scndWordCap = false;

    for(String word : words)
    {
        wordIndx++;

        //System.out.println("word = <" + word + ">");

        Pattern ptrn = Pattern.compile("^[A-Z].+");

        Matcher mtchr = ptrn.matcher(word);

        while(mtchr.find())
        {
            String match = mtchr.group();

            //System.out.println("\tMatch = <" + match + ">");

            if(wordIndx == 1)
            {
                frstWordCap = true;
            }
            else if(wordIndx == 2)
            {
                scndWordCap = true;
            }
        }
    }

    rslt = frstWordCap && scndWordCap;

    return rslt;
}
person amphibient    schedule 19.11.2012

Попробуй это:

public class RegularExp 
{

    /**
     * @param args
     */
    public static void main(String[] args) {
        String regex = "[A-Z][^\\s.]*\\s[A-Z].*";
        String str = "APzsnnm lmn Dlld";
        System.out.println(str.matches(regex));

    }

}
person jsjunkie    schedule 19.11.2012