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

Мне посчастливилось установить font-size: 0 внешнего элемента, а font-size селектора :after - все, что мне нужно.

17
задан John Daly 17 February 2009 в 23:48
поделиться

5 ответов

Замена

^.*?(?=[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})
48
ответ дан 30 November 2019 в 06:20
поделиться

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

соответствовал бы:

Это - текст

0
ответ дан 30 November 2019 в 06:20
поделиться

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

'.*([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

, Который является тем, что Вы ищете, я думаю

0
ответ дан 30 November 2019 в 06:20
поделиться

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

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

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

я отчасти понимаю, что они, как предполагается, легче, после того как Вы знаете их - но Вы видите, что кто-то задает вопрос как это и понимает, что они не легки для каждого программиста просто добраться путем поглядывания на него. Если это стоит 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 строк, но это просто, читаемо, и быстрее, чем большинство (все?) синтаксические анализаторы РЕ. После того как Вы перенесли регулярное выражение в метод и прокомментировали это, разница в размерах не измерима. Разница во времени - хорошо для плаката, это, очевидно, было бы НАМНОГО меньше времени - как это могло бы быть для следующего парня, который сталкивается с его кодом.

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

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

1
ответ дан 30 November 2019 в 06:20
поделиться

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

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");
        }        
    }
}

РЕДАКТИРОВАНИЕ: Исходный ответ

Это похоже, он делает правильную вещь:

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
ответ дан 30 November 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: