Как использовать регулярные выражения, чтобы соответствовать всем до определенного типа слова
Я новичок в регулярных выражениях.
Можно ли совместить все перед словом, которое соответствует определенным критериям:
например.
ЭТО ИСПЫТАНИЕ - - +++ Это тест
Я хотел бы, чтобы он встретил слово, которое начинается с прописного, а следующий символ - строчным. Это правильное слово. Затем я хотел бы удалить все до этого слова.
В приведенном выше примере должен быть указан: Это тест
Я хочу только эту обработку, пока не найдет правильное слово, а затем остановится.
Любая помощь будет оценена.
Спасибо
Ответы
Ответ 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] +.)
будет соответствовать:
Это текст