2015-01-14 4 views
0

Я делаю небольшой проект, где мне нужно читать строки с командами. Команда представляет собой строку, которая соответствует шаблону "\\&[abcd]".
Если между предыдущим совпадением и следующим совпадением существует строка, я должен выполнить операцию над ней на основе предыдущей команды. Я зацикливаюсь с while (m.find()), и я могу получить строки, соответствующие шаблону (например, команды), но я не уверен, как получить строки, которые не соответствуют шаблону. Замена команд на "" и получение всей строки будет одним из способов, но тогда я не смогу выполнять операции над определенными подстроками.
Итак, как я могу выполнять операции над строками между командами на основе предыдущей команды?Все, кроме регулярного выражения

код У меня возникли проблемы написания:

int i=0; 
while (m.find()) { 
     switch (m.group()) { 
     case "&a": 
      i+=1; 
      break; 
     case "&b": 
      i+=2; 
      break; 
     case "&c": 
      i=4; 
      break; 
     ... 
     } 
    //get non-pattern matching strings and modify it based on previous commands. 
} 

После ввода: $a$bLola$cg

будет производить следующий вывод: LolaLolaLolagggg

EDIT:

Количество команд или строки не заданы и могут быть в любом порядке. Если нет нити, ничего не будет напечатано. Если команд нет, строка будет напечатана без изменений.
duplicate Ответ здесь не применим: Regex для записи только строк (не команд) не работает, потому что после первого цикла i полностью изменился бы.

Следующие данные: $a$bLola$cg будет выводить LolagLolagLolagLolag.

+2

Можете привести примеры некоторых строк и их замен. – anubhava

ответ

-1

Способ, которым это работает, заключается в том, чтобы захватить команду и строку в одном совпадении.
Весь ввод разобран до тех пор, пока существует одна команда.
Каждое совпадение даст вам команду и строку (группы 1 и 2 соответственно).

Всякий раз, когда вы фиксируете строку, выполняйте операцию над ней на основе команд, а
добавьте ее в новую строку.

Это команда, прежде чем строка:

# "(?s)(&[abcd])((?:(?!&[abcd]).)+)?" 

(?s)       # Dot-all modifier, dot matches any character 
(& [abcd])     # (1), Command, required 

(       # (2 start), String 
     (?:       # Cluster start 
      (?! & [abcd])    # Lookahead assertion, not a command ahead 
      .        # Assertion passed, grab this character 
    )+       # Cluster end, do 1 to many times 
)?        # (2 end), optional 

Это команда после строки:
Выбирай.

# "(?s)((?:(?!&[abcd]).)+)?(&[abcd])" 

(?s)       # Dot-all modifier, dot matches any character 
(       # (1 start), String 
     (?:       # Cluster start 
      (?! & [abcd])    # Lookahead assertion, not a command ahead 
      .        # Assertion passed, grab this character 
    )+       # Cluster end, do 1 to many times 
)?       # (1 end), Optional 
(& [abcd])     # (2), Command, Required 
Смежные вопросы