2013-07-11 4 views
0

Я пытаюсь построить это простое регулярное выражение, чтобы совместить слова + пробелы в Java, но я запутался, пытаясь его выработать. На этом сайте есть много подобных примеров, но ответы в основном выдают само регулярное выражение, не объясняя, как оно построено.Java Regex to Match words + spaces

То, что я ищу, является Линией Мыслей за формированием регулярного выражения.

Пример Строка ввода:

String Tweet = "\"Whole Lotta Love\" - Led Zeppelin";

, который при печати является: "Whole Lotta Love" - Led Zeppelin

Постановка задачи:

Я хочу узнать, если строка имеет котировку в нем. В приведенной выше строке примера Whole Lotta Love - это цитата.

Что я пробовал:

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

"\"(\\w+\")" и "\"(^\")"

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

"Whole" Lotta Love 

Поэтому я попытался изменить мое регулярное выражение соответствует пробелам, и именно здесь я потерялся.

Я попытался следующие, но они не совпадают

"\"(\\w+?\\s+\")", "\"(\\w+)(\\s+)\"", "\"(\\w+)?(\\s+)\""

Я был бы признателен, если кто-то может помочь мне понять, как это constuct.

+3

Вы имеете в виду это '' \\ "[\\ w \\ s] + \\" '? – zEro

+0

Аналогично этому вопросу: http://stackoverflow.com/questions/8062469/regex-not-matching -words-delimited-by-whitespace? rq = 1 – joe776

+1

небольшой совет: вы можете попробовать регулярные выражения онлайн здесь: http://gskinner.com/RegExr/ –

ответ

4

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

"Whole "

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

"\"([\\w\\s]+)\""

Это соответствует одному или нескольким [пробельные/буквенно-цифровые символы]. Обратите внимание, что буквенно-цифровое включает в себя _.

Если вы хотите быть более общими, вы могли бы использовать

"\"([^\"]+)\""

который будет соответствовать всем кроме двойных кавычек. Например, «Кто первый?» (включая кавычки) будет сопоставляться вторым регулярным выражением, но не первым, так как он включает знаки препинания.

+1

или вы можете использовать неохотный помощник, такой как Mena: «\» (. +?) \ "". Мой пример не является специфичным для Java. – ddr

1

Вы можете использовать это:

\"(?>\\w+ *)+\" 

или класс символов, как ZERO предполагает его.

2

Простейший способ состоит в том, чтобы петля while искала что-либо между двумя кавычками на вашем входе, поэтому вы проверяете несколько выражений с кавычками.

Мой пример здесь принимает что-либо между двумя кавычками. Вы можете уточнять только с алфавитами и пробелами.

String quotedTweet = "\"Whole Lotta Love\" - Led Zeppelin"; 
String unquotedTweet = "Whole Lotta Love from Led Zeppelin"; 
String multipleQuotes = "\"Whole Lotta Love\" - \"Led\" Zeppelin"; 
// commented Pattern for only alphabetics or spaces 
// Pattern pattern = Pattern.compile("\"([\\p{Alpha}\\p{Space}]+?)\""); 
Pattern pattern = Pattern.compile("\"(.+?)\""); 
Matcher matcher = pattern.matcher(quotedTweet); 
while (matcher.find()) { 
    // will find "Whole Lotta Love" 
    System.out.println(matcher.group(1)); 
} 
matcher = pattern.matcher(unquotedTweet); 
while (matcher.find()) { 
    // will find nothing 
    System.out.println(matcher.group(1)); 
} 
matcher = pattern.matcher(multipleQuotes); 
while (matcher.find()) { 
    // Will find "Whole Lotta Love" and "Led" 
    System.out.println(matcher.group(1)); 
} 

Редактировать этот пример и прокомментировал вариант не помешает цитируемым пропуска, как и в " ". Дайте мне знать, если это требование - в этом случае шаблон будет немного сложнее.

Выход:

Whole Lotta Love 
Whole Lotta Love 
Led