Java, как использовать шаблон соответствия с помощью регулярных выражений, чтобы найти определенную строку

Я не знаком с Patterns & matchers, и я довольно застрял в этой проблеме.

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

Pattern p = Pattern.compile("\\[(.*?)\\]");
Matcher m = p.matcher(in);

while(m.find()) {
     String found = m.group(1).toString();
}

Но в моей строке, скажем, у меня есть следующие примеры:

String in = "test anything goes here [A#1234|567]"; //OR
String in = "test anything goes here [B#1234|567]"; //OR
String in = "test anything goes here [C#1234|567]";

я хочу найти [A# | ] или же [B# | ] или же [C# | ] в строке, как я могу использовать регулярное выражение, чтобы найти выражение?

4 ответа

Решение

Использование [ABC]# в вашем регулярном выражении, чтобы соответствовать вашему выражению.

Pattern p = Pattern.compile("(\\[[ABC]#.*?\\])");

Если поля являются цифрами, то вы можете безопасно использовать \d+

Pattern p = Pattern.compile("(\\[[ABC]#\\d+\\|\\d+\\])");

Я бы использовал простой Pattern как в следующем примере:

String[] in = { "test anything goes here [A#1234|567]",
            "test anything goes here [B#1234|567]",
            "test anything goes here [C#1234|567]" };

    Pattern p = Pattern.compile("\\[[A-Z]#\\d+\\|\\d+\\]");
    for (String s: in) {
        Matcher m = p.matcher(s);
        while (m.find()) {
            System.out.println("Found: " + m.group());
        }
    }
}

Выход

Found: [A#1234|567]
Found: [B#1234|567]
Found: [C#1234|567]

Я предполагаю, что ваш Pattern имеет определенные ограничения:

  • Начинается с [
  • Сопровождаемый одной заглавной буквой без акцента
  • С последующим #
  • Далее следует любое количество цифр
  • С последующим |
  • Далее следует любое количество цифр
  • С последующим ]

Пытаться:

Pattern p = Pattern.compile("(\\[[A-Z]#.*\\])");

Если вы хотите сопоставить любые заглавные буквы от A до Z. Неясно, хотите ли вы, чтобы все данные между [] хоть.

Мое решение:

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Some {
    public static void main(String[] args) throws java.lang.Exception {
        String[] in = {
            "test anything goes here [A#1234|567]",
                "test anything goes here [B#1234|567]",
                "test anything goes here [C#1234|567]"
        };

        Pattern p = Pattern.compile("\\[(.*?)\\]");
        for (String s: in ) {
            Matcher m = p.matcher(s);
            while (m.find()) {
                System.out.println("Found: " + m.group().replaceAll("\\d", ""));
            }
        }

    }
}

Это использует ваше оригинальное регулярное выражение.

Демо: http://ideone.com/4Z5oYD

Другие вопросы по тегам