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