Соответствующая часть регулярного выражения - PullRequest
1 голос
/ 03 декабря 2009

Я должен соответствовать звездам (*), которые удовлетворяют таким условиям:

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 04 декабря 2009

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

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

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

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

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.");
        }



}

}

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

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

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

Результат вернет 3 группы.

Подробнее см. По этой ссылке: http://java.sun.com/docs/books/tutorial/essential/regex/groups.html

0 голосов
/ 03 декабря 2009

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

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

0 голосов
/ 03 декабря 2009

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

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

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

Имея больше информации, мы можем предоставить лучшие ответы.

0 голосов
/ 03 декабря 2009

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

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

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

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