Разбор цитируемого текста в Java - PullRequest
5 голосов
/ 27 августа 2011

Есть ли простой способ разобрать цитируемый текст как строку в java? У меня есть такие строки для разбора:

author="Tolkien, J.R.R." title="The Lord of the Rings"
publisher="George Allen & Unwin" year=1954 

и все, что я хочу, это Толкиен, Дж.Р.Р., Властелин колец, Джордж Аллен и Унвин, 1954 как струнные.

Ответы [ 3 ]

5 голосов
/ 27 августа 2011

Вы можете использовать регулярное выражение, например

"(.+)"

Соответствует любому символу между кавычками. В Java будет:

Pattern p = Pattern.compile("\\"(.+)\\"";
Matcher m = p.matcher("author=\"Tolkien, J.R.R.\"");
while(matcher.find()){
  System.out.println(m.group(1));      
}

Обратите внимание, что используется группа (1), это второе совпадение, первое, группа (0), это полная строка с кавычками

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

String quoted = "author=\"Tolkien, J.R.R.\"";
String unquoted;    
if(quoted.indexOf("\"") == 0 && quoted.lastIndexOf("\"")==quoted.length()-1){
    unquoted = quoted.substring(1, quoted.lenght()-1);
}else{
  unquoted = quoted;
}
3 голосов
/ 27 августа 2011

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

Мне нравится использовать String.split (). Это простая функция, которая делает то, что вам нужно.

Так что, если у меня есть строка word: "hello" и я хочу взять "привет", я могу просто сделать это:

myStr = string.split("\"")[1];

Это сократит строку на биты на основе кавычек.

Если я хочу быть более конкретным, я могу сделать

myStr = string.split("word: \"")[1].split("\"")[0];

Таким образом, я вырезал его с word: " и "

Конечно, вы столкнетесь с проблемами, если word: " будет повторяться дважды, для этого и нужны шаблоны. Я не думаю, что вам придется решать эту проблему для вашего конкретного вопроса.

Также будьте осторожны с такими персонажами, как. а также . В Split используется регулярное выражение, поэтому эти персонажи будут вызывать забавное поведение. Я думаю, что "\\" = \ избежит этих забавных правил. Кто-нибудь поправит меня, если я ошибаюсь.

Удачи!

1 голос
/ 27 августа 2011

Можете ли вы предположить, что ваш документ правильно сформирован и не содержит синтаксических ошибок?Если это так, вы просто интересуетесь каждым другим токеном после использования String.split ().

Если вам нужно что-то более надежное, вам может понадобиться класс сканера (или StringBuffer и цикл for ;-)), чтобы выбрать действительные токены с учетом дополнительныхкритерий выше «Я где-то видел кавычку».

Например, по некоторым причинам вам может потребоваться более надежное решение, чем слепое разбиение строки на кавычки: возможно, это только действительный токен, если кавычка начинает егоприходит сразу после знака равенства.Или, может быть, вам нужно нужно обрабатывать значения, которые не указаны в кавычках, а также в кавычках?Требуется ли обрабатывать \" в качестве экранированной кавычки, или это считается концом строки.Может ли он иметь одинарные или двойные кавычки (например, html), или он всегда будет правильно отформатирован двойными кавычками?

Один надежный способ - думать как компилятор и использовать Lexer на основе Java (например, JFlex), но это может быть излишним для того, что вам нужно.

Если вы предпочитаете низкоуровневый подход, вы можете перебирать свой входной поток символ за символом, используя цикл while, и когдавы видите =", начинающий копировать символы в StringBuffer, пока не найдете другой неэкранированный ", либо объединяющий различные разыскиваемые значения или добавляющий их в какой-либо список (в зависимости от того, что вы планируете делать сваши данные).Затем продолжайте чтение, пока не встретите свой стартовый токен (например: =") снова, и повторите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...