2014-01-04 16 views
-1

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

  1. "СВИНЦОВО, нефильтрованный ИТОГО"
  2. "РН (-log Н + CONCN)"
  3. "ПОТОК УСЛОВИЕ"
  4. "НИТРАТЫ ИТОГО, UNFIL.REAC"
  5. "TETRACHLOROBENZENE 1,2,3,4" < - это одна химия l имя

Так что я могу использовать, что удовлетворит 5 примеров, которые у меня есть? Или мне придется искать вручную для каждого и разбираться с ним именно так?

То, что я думал, это проверить формат каждой строки, которую я получаю. Поэтому, если строка не имеет запятых (№ 2 & 3), возьмите всю строку; если он имеет запятые, то разбивается на первый небуквенный символ (например, пробел или запятая). Однако последний не будет говорить ни слова. 5, так как я хочу всю строку.

Спасибо за любую помощь.

+1

Возможно, вы имели ввиду только bold 'stream' в 'stream condition' ??И вы должны изменить свой заголовок на слово, а не на букву. – danronmoon

+2

Я бы сказал, что вы решили это сами! Теперь создайте фильтр регулярных выражений, соответствующий вашему тестовому примеру, и все будет готово. – STLDeveloper

+0

@ danronmoon no, я хотел бы оба слова. – user3015565

ответ

2

То, что вы пытаетесь сделать, по существу невозможно, просто потому, что имена, которые вы перечисляете, не имеют общего шаблона. Последний пример сам по себе может сломать вещи, поскольку он включает в себя пробел и запятую в этом слове, в то время как другим примерам нужно сломать пространство и запятые!

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

Сохраните словарь в HashSet или HashMap, и вы можете быстро проверить соответствие, просто сканируйте свою строку, ища первый неалфавитный номер. Проверьте, что то, что вы нашли до сих пор, находится в наборе, если оно не повторяет процесс для продолжения сканирования, пока вы не найдете совпадение или не закончите String.

0

Попробуйте это:

 String lines[]= {"LEAD, UNFILTERED TOTAL","PH(-LOG H+ CONCN)","STREAM CONDITION","NITRATES TOTAL, UNFIL.REAC","TETRACHLOROBENZENE 1,2,3,4"}; 
     String COMMA=","; 
     String REGEX="(^(\\w|\\+|\\-|\\(|\\))+(\\W?,?\\d)*)"; 
     Pattern res=Pattern.compile(REGEX); 
     Pattern resComma=Pattern.compile(COMMA); 
     Matcher match; 
     for(String line:lines){ 
     if(!resComma.matcher(line).find()){ 
      System.out.println(" RESULT "+ line); 
     } 
     else if ((match=res.matcher(line)).find()) 
      System.out.println(" RESULT "+ match.group()); 
     } 
0

Вместо того, чтобы использовать регулярное выражение, которое вы могли бы использовать перерыв итератор - java.text.BreakIterator.

Чтобы получить слова в использовании строки:

BreakIterator iter = BreakIterator.getWordInstance(); 

iter.setText(text); 

for (int loc = iter.first(), lastLoc = 0; loc != BreakIterator.DONE; loc = lastLoc, loc = iter.next) 
{ 
    if (loc == 0) 
     continue; 

    String word = text.substring(lastLoc, loc); 
} 

Перерыв итераторы используются для поиска «границы» в тексте - которые могут быть слова или предложения или что-то другое. В приведенном выше примере используется предопределенный итератор прерывания слова, который возвращает индекс начала слова или знаков пунктуации и перемещается по тексту при последовательных вызовах. Цикл просто извлекает слова, используя текущие и предыдущие местоположения, возвращаемые итератором, пунктуация будет извлекаться как отдельные слова.

+0

Спасибо за ответ. Не могли бы вы объяснить, что это делает? – user3015565

Смежные вопросы