2009-12-03 2 views
1

я должен соответствовать звездам (*), что удовлетворяет такие условия:Matching части регулярных выражений

\*\S.*\S\* -> (for example *y text1 text2 u*) 

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

Pattern params = Pattern.compile("\\*\\S.*\\S\\*"); 

, но это соответствует звезды и текст между звездами ...)

ответ

2

Вы можете использовать не-захвата групп, как это:

`Pattern pattern = Pattern.compile("(\\*)(?:\\S.*\\S)(\\*)");` 

В принципе, шаблон матч состоит из 3 групп: (\\*), (?:\\S.*\\S), (\\*). Вторая группа похожа на (?: Re), это не захватывающая группа, означает, что регулярное выражение не считает эту группу результатом.

Вот пример кода:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

public class RegexTest { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 


     Pattern pattern = Pattern.compile("(\\*)(?:\\S.*\\S)(\\*)"); 

     String string ="for example *y text1 text2 u*"; 
     Matcher matcher = pattern.matcher(string); 

     boolean found = false; 
     if (matcher.find()) { 
      System.out.println("group count:"+matcher.groupCount()); 
      System.out.println("---------------"); 
      for(int i=1; i<=matcher.groupCount(); i++) 
      { 
       System.out.println("group "+i); 
       System.out.println("start index:"+matcher.start(i)); 
       System.out.println("end index:"+matcher.end(i)); 
       System.out.println("text:"+string.substring(matcher.start(i), matcher.end(i))); 
       System.out.println("---------------"); 
      } 

      found = true; 
     } 
     if(!found){ 
      System.out.println("not found."); 
     } 



} 

} 

Пожалуйста, обратите внимание на Яве счетчик группы в классе Matcher является 1 на основе. Отсчет группы в приведенной выше коде 2.

Если вы не используете не-захват группы, как это:

Pattern pattern = Pattern.compile("(\\*)(\\S.*\\S)(\\*)"); 

Результат будет возвращать 3 группы.

Для получения дополнительной информации, пожалуйста, смотрите по этой ссылке: http://java.sun.com/docs/books/tutorial/essential/regex/groups.html

0

Вы должны использовать не жадный шаблон, как:

Pattern.compile("\\*\\S.*?\\S\\*"); 

Обратите внимание, что дополнительные ? характер

0

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

Что вы на самом деле пытаетесь сделать?

0

Я согласен с другими респондеров: неясно, что именно вы пытаетесь сделать, но если вы хотите ничего между двумя * s в тексте, то:

Pattern params = Patterns.compile ("\\*[^\\*]+\\*"); 

Это будет найти каждый не - длина строки между двумя *.

С дополнительной информацией мы можем предоставить более качественные ответы.

+0

Примечания: вылетающий в скобках технически ненужные, но я считаю, что сбивает с толком меньше людей при необходимости поставить * в качестве фактического характера. – PSpeed

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