Подтвердить что ты не робот

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

Я новичок в регулярных выражениях.

Можно ли совместить все перед словом, которое соответствует определенным критериям:

например.

ЭТО ИСПЫТАНИЕ - - +++ Это тест

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

В приведенном выше примере должен быть указан: Это тест

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

Любая помощь будет оценена.

Спасибо

4b9b3361

Ответ 1

Заменить

^.*?(?=[A-Z][a-z])

с пустой строкой. Это работает для ввода ASCII. Для ввода без ASCII (Unicode, другие языки) применяются разные стратегии.

Объяснение

.*?    Everything, until
(?=    followed by
[A-Z]  one of A .. Z and
[a-z]  one of a .. z
)

Вариант с поддержкой Java Unicode будет следующим:

^.*?(?=\p{Lu}\p{Ll})

Ответ 2

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

import java.util.regex.*;

public class Test
{
    public static void main(String args[])
    {
        Pattern pattern = Pattern.compile("[A-Z][a-z].*");

        String original = "THIS IS A TEST - - +++ This is a test";
        Matcher match = pattern.matcher(original);
        if (match.find())
        {
            System.out.println(match.group());
        }
        else
        {
            System.out.println("No match");
        }        
    }
}

EDIT: оригинальный ответ

Похоже, он делает правильные вещи:

import java.util.regex.*;

public class Test
{
    public static void main(String args[])
    {
        Pattern pattern = Pattern.compile("^.*?([A-Z][a-z].*)$");

        String original = "THIS IS A TEST - - +++ This is a test";
        String replaced = pattern.matcher(original).replaceAll("$1");

        System.out.println(replaced);
    }
}

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

Вышеупомянутое потерпит неудачу с "*** FOO *** I am fond of peanuts", потому что "I" не будет считаться правильным словом. Если вы хотите исправить это, измените [a-z] на [a-z\s], который позволит вместо пробела пробел.

Ответ 3

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

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

Я провел много синтаксического анализа строк (используется для экранирования экранов vt100), и я никогда не нашел ни одного случая, когда Regular Expressions было бы намного проще, чем просто писать код. (Может быть, пара была бы немного легче, но немного).

Я понимаю, что они должны быть проще, когда вы их знаете, но вы видите, что кто-то задает такой вопрос и понимает, что каждому программисту нелегко просто взглянуть на него. Если это стоит 1 программист где-то вниз по линии 10 минут мысли, у него есть огромные чистые убытки по сравнению с его кодированием, даже если вам понадобилось 5 минут, чтобы написать 5 строк.

Таким образом, он будет нуждаться в документации - и если кто-то, кто находится на том же уровне, сталкивается с этим, он не сможет модифицировать его без знания вне своего домена, даже с документацией.

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

public String getRealText(String scanMe) {
    for(int i=0 ; i < scanMe.length ; i++)
        if( isUpper(scanMe[i]) && isLower(scanMe[i+1]) )
            return scanMe.subString(i);
return null; }

Я имею в виду это 5 строк, но он прост, читабель и быстрее, чем большинство (все?) RE-парсеров. Как только вы завернули регулярное выражение в методе и прокомментировали его, разница в размере не измерима. Разница во времени - хорошо для плаката, очевидно, было бы намного меньше времени - как это может быть для следующего парня, который сталкивается с его кодом.

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

Кстати, убедитесь, что вы ищете место во втором слоте, а не только строчную переменную, иначе пропустите любые строки, начинающиеся со слов A или I.

Ответ 4

то вы можете сделать что-то вроде этого

'.*([A-Z][a-z].*)\s*'

.* matches anything
( [A-Z] #followed by an uper case char 
  [a-z] #followed by a lower case 
  .*)   #followed by anything
  \s*   #followed by zeror or more white space

Это то, что вы ищете Я думаю

Ответ 5

([A-Z] [A-Z] +.)

будет соответствовать:

Это текст