2014-09-12 6 views
3

Мне нужно регулярное выражение java, соответствующее слову, с учетом возможности комментария внутри каждых двух последующих букв. Например, "W/*comment1*/OR/*comment2*/D". Я пытался использовать именованный захваченную группу и обратной ссылки:Java regex для совпадения слов с необязательными множественными комментариями между каждыми двумя буквами (как обратная ссылка на подвыражение регулярных выражений)

(?<comment>\s*/\*.*\*/\s*)W\k<comment>*O\k<comment>*R\k<comment>*D 

Но это не работает, потому что обратная ссылка ссылается на матч с именем группы, а не фактической группы подвыражения. Таким образом, я должен был повторить свой комментарий подвыражению (?<comment>\s*/\*.*\*/\s*) во всех местах, где ожидаются:

W(\s*/\*.*\*/\s*)*O(\s*/\*.*\*/\s*)*R(\s*/\*.*\*/\s*)*D 

Это работает, но есть ли более элегантное решение, без необходимости повторять «комментарий» подшаблоны много раз?

+4

пример входного выхода помог бы – vks

+0

Как насчет того, Я думаю, что это путь. Это делает код более простым и, скорее всего, быстрым, если не быстрее, чтобы запустить два простых регулярных выражения, чем сложный. Плюс легче обслуживать и пробовать ... – Johnride

+0

@vks Это пример: W/* comment1 */OR/* comment2 */D –

ответ

1

Вы можете сделать это путем захвата письмо (или несколько) в то время, в то время как отбрасывание факультативные следующие комментарии, например:

 String toBeParsed="W/* this is comment 1 */OR/*this is comment 2*/D"; 
     String regexp = "(\\w+)(/\\*.*?\\*/)*"; // match letters + optional comment 
     Pattern pattern =Pattern.compile(regexp); 
     Matcher matcher=pattern.matcher(toBeParsed); 
     String word=""; 
     while(matcher.find()){ 
      String letter=matcher.group(1); 
      String comment=matcher.group(2); 
      System.out.println("found letter(s) "+letter); 
      word+=letter; 
      if (comment!=null) System.out.println("discarding comment "+matcher.group(2)); 
     } 
     System.out.println(word); 

выход

found letter(s) W 
discarding comment /* this is comment 1 */ 
found letter(s) OR 
discarding comment /*this is comment 2*/ 
found letter(s) D 
WORD 
+1

Или, может быть, даже в фразах слов: '' (\ w +) (/ \\ * [a-zA-Z0-9 \ s! :? _ *] * \\ * /) * "'. OP сказал «слово», поэтому я предполагаю, что они означают только альфа-символы, но я сомневаюсь, что он использует не-альфа-символы. Кроме того, ОП не сказал, что в комментарии не было пробелов, поэтому я изменил классификатор комментария. – sparks

+0

Да, фразы слов - лучшая идея. Я поправлю свое решение соответственно –

0

«как обратно ссылка подвыражение регулярного выражения "

Вы имеете в виду это? :

"(.*)\\1" 

Это соответствует любому дублируемому слову. \ 1 относится к первой группе, которая является первой скобкой.

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

  • Нет связанных вопросов^_^