Мне нужна помощь в получении правильного выражения Regex - PullRequest
0 голосов
/ 05 августа 2011

Я пытаюсь получить регулярное выражение, чтобы найти несколько записей моего шаблона в строке.Примечание: я использую Regex около часа ... = /

Например:

<a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>

Должен совпадать дважды:

1) <a href="G2532" id="1">back</a>
2) <a href="G2564" id="2">next</a>

Я думаюответ заключается в правильном овладении жадностью против неохотно против притяжательности, но я не могу заставить ее работать ...

Я думаю, что я близок, строка Regex, которую я создал до сих пор:1011 *

(<a href=").*(" id="1">).*(</a>)

Но сопоставитель Regex возвращает 1 совпадение, всю строку ...

У меня есть (скомпилированный) тестовый набор Java Regex в приведенном ниже коде.Вот мои недавние (тщетные) попытки получить это с помощью этой программы, вывод должен быть довольно интуитивным.

Enter your regex: (<a href=").*(" id="1">).*(</a>)
Enter input string to search: <a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>
I found the text "<a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>" starting at index 0 and ending at index 63.

Enter your regex: (<a href=").*(" id="1">).*(</a>)?
Enter input string to search: <a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>
I found the text "<a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>" starting at index 0 and ending at index 63.

Enter your regex: (<a href=").*(" id="1">).*(</a>)+
Enter input string to search: <a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>
I found the text "<a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>" starting at index 0 and ending at index 63.

Enter your regex: (<a href=").*(" id="1">).*(</a>)?
Enter input string to search: <a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>
I found the text "<a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>" starting at index 0 and ending at index 63.

Enter your regex: ((<a href=").*(" id="1">).*(</a>))?
Enter input string to search: <a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>
I found the text "<a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>" starting at index 0 and ending at index 63.
I found the text "" starting at index 63 and ending at index 63.

Enter your regex: ((<a href=").*(" id="1">).*(</a>))+?
Enter input string to search: <a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>
I found the text "<a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>" starting at index 0 and ending at index 63.

Enter your regex: (((<a href=").*(" id="1">).*(</a>))+?)
Enter input string to search: <a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>
I found the text "<a href="G2532" id="1">back</a> <a href="G2564" id="2">next</a>" starting at index 0 and ending at index 63.

Вот Java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexTestHarness {

    public static void main(String[] args){
        try{
            while (true) {

                System.out.print("\nEnter your regex: ");

                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                Pattern pattern = Pattern.compile(reader.readLine());

                System.out.print("Enter input string to search: ");
                Matcher matcher = pattern.matcher(reader.readLine());

                boolean found = false;
                while (matcher.find()) {
                    System.out.println("I found the text \"" + matcher.group() + "\" starting at " +
                       "index " + matcher.start() + " and ending at index " + matcher.end() + ".");
                    found = true;
                }
                if(!found){
                    System.out.println("No match found.");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }

    }
}

1 Ответ

1 голос
/ 05 августа 2011

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

<a href=".*?" id="1">.*?</a>

Я преобразовал снимки в нежадные, добавив ? после .*

Но если вы сомневаетесь, вы можете использовать этот трюк:

<a href="[^"]*" id="1">[^<]*</a>

[^"]* означает любое количество символов, которые не являются двойными кавычками
[^<]* означает любое количество символов, которые не являются левым углом

Так что вы не должны беспокоиться о жадных / не жадных

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