Если я правильно понимаю, вы хотите извлечь подстроки, разделенные двойными кавычками ("). Вы можете использовать группы перехвата в регулярных выражениях:
String text = "Vulcans are a humanoid species in the fictional \"Star Trek\"" +
" universe who evolved on the planet Vulcan and are noted for their " +
"attempt to live by reason and logic with no interference from emotion" +
" They were the first extraterrestrial species officially to make first" +
" contact with Humans and later became one of the founding members of the" +
" \"United Federation of Planets\"";
String[] entities = new String[10]; // An array to hold matched substrings
Pattern pattern = Pattern.compile("[\"](.*?)[\"]"); // The regex pattern to use
Matcher matcher = pattern.matcher(text); // The matcher - our text - to run the regex on
int startFrom = text.indexOf('"'); // The index position of the first " character
int endAt = text.lastIndexOf('"'); // The index position of the last " character
int count = 0; // An index for the array of matches
while (startFrom <= endAt) { // startFrom will be changed to the index position of the end of the last match
matcher.find(startFrom); // Run the regex find() method, starting at the first " character
entities[count++] = matcher.group(1); // Add the match to the array, without its " marks
startFrom = matcher.end(); // Update the startFrom index position to the end of the matched region
}
ИЛИ написать" парсер "с функциями String:
int startFrom = text.indexOf('"'); // The index-position of the first " character
int nextQuote = text.indexOf('"', startFrom+1); // The index-position of the next " character
int count = 0; // An index for the array of matches
while (startFrom > -1) { // Keep looping as long as there is another " character (if there isn't, or if it's index is negative, the value of startFrom will be less-than-or-equal-to -1)
entities[count++] = text.substring(startFrom+1, nextQuote); // Retrieve the substring and add it to the array
startFrom = text.indexOf('"', nextQuote+1); // Find the next " character after nextQuote
nextQuote = text.indexOf('"', startFrom+1); // Find the next " character after that
}
В обоих примерах образец текста жестко задан для примера, и предполагается, что присутствует одна и та же переменная (переменная String с именем text
).
Если вы хотите проверить содержимое массива entities
:
int i = 0;
while (i < count) {
System.out.println(entities[i]);
i++;
}
Я должен предупредить вас, могут возникнуть проблемы с граничными / граничными случаями (т. Е. Когда символ "в начале или в конце строки. Эти примеры не будут работать должным образом, если четность символов «неравномерна (т. е. если в тексте есть нечетное число символов). Вы можете использоватьПредварительная проверка на четность:
static int countQuoteChars(String text) {
int nextQuote = text.indexOf('"'); // Find the first " character
int count = 0; // A counter for " characters found
while (nextQuote != -1) { // While there is another " character ahead
count++; // Increase the count by 1
nextQuote = text.indexOf('"', nextQuote+1); // Find the next " character
}
return count; // Return the result
}
static boolean quoteCharacterParity(int numQuotes) {
if (numQuotes % 2 == 0) { // If the number of " characters modulo 2 is 0
return true; // Return true for even
}
return false; // Otherwise return false
}
Обратите внимание, что если numQuotes
равно 0
, этот метод по-прежнему возвращает true
(потому что 0 по модулю любое число равно 0, поэтому (count % 2 == 0)
будетбыть true
) хотя вы не хотели бы идти ахпрекратите синтаксический анализ, если «символов» нет, поэтому вам нужно где-нибудь проверить это условие.
Надеюсь, это поможет!