У меня есть строки следующих форматов:
В основном форма [(xx) (KEYX) некоторый текст] появляется один или несколько раз в строке, смешанной с другими символами.
В вышеуказанном формате ключ - это KEYX, а значение - некоторый текст.
Я хотел бы извлечь все пары ключевых значений из любой строки, содержащей любое количество таких форматов.
Я попытался использовать прямой синтаксический анализ, используя подстроку и т.д., Но это не кажется чистым решением. Можно ли сделать это лучше, используя регулярное выражение или любую другую технику, которую предоставляет Java?
Вы можете использовать регулярное выражение и совпадение, чтобы найти свой ключ и значение:
public static void main(String[] args) throws IOException
{
String test = "[(xx)(KEYX)some text]";
Pattern pattern = Pattern.compile("\\(KEY.*\\)");
Matcher matcher = pattern.matcher(test);
matcher.find();
String s = matcher.group(0);
String s1 = test.substring(matcher.end(), test.length() - 1);
System.out.println("" + s + " " + s1);
}
Результатом этого будет:
(KEYX) some text
Если вы измените строку на "[(xx)(KEYXYYYYYY)some text]"
то это будет:
(KEYXYYYYYY) some text
Если вы не хотите скобки вокруг ключа:
public static void main(String[] args) throws IOException
{
String test = "[(xx)(KEYXYYYYYY)some text]";
Pattern pattern = Pattern.compile("(?<=\\()KEY.*(?=\\))");
Matcher matcher = pattern.matcher(test);
matcher.find();
String s = matcher.group(0);
String s1 = test.substring(matcher.end() + 1, test.length() - 1);
System.out.println("" + s + " " + s1);
}
Результатом будет:
KEYXYYYYYY some text
************************************************** ************ОБНОВИТЬ************************************* ********************* Сопоставьте что-нибудь для ключа не только КЛЮЧ:
public static void main(String[] args) throws IOException
{
String test = "[(xx)(time.zone1)some text]";
Pattern pattern = Pattern.compile("(?<=\\()[^xy].*(?=\\))");
Matcher matcher = pattern.matcher(test);
matcher.find();
String s = matcher.group(0);
String s1 = test.substring(matcher.end() + 1, test.length() - 1);
System.out.println("" + s + " " + s1);
}
Это приведет к выводу:
time.zone1 some text
************************************************** ********ОБНОВИТЬ***************************************** *****
Несколько совпадений в одной строке:
public static void main(String[] args) throws IOException
{
String test = "[(xx)(time1.zone1)some text1]blahblahblah[(xx)(time2.zone2)some text2]";
Pattern pattern = Pattern.compile("(?<=\\()[^xy].*?]");
Matcher matcher = pattern.matcher(test);
while(matcher.find())
{
String s = matcher.group(0);
String s1 = s.substring((s.indexOf(")") + 1), (s.length() - 1));
s = s.substring(0, s.indexOf(")"));
System.out.println("" + s + " " + s1);
}
}
Это приведет к выводу:
time1.zone1 some text1
time2.zone2 some text2
Если я понимаю ваш вопрос, вы можете положиться на KEY
начиная с четвертого символа, а затем найти следующий ")", как
String str = "(xx)(KEY1)some text";
int open = str.indexOf("(", 4);
int pos = str.indexOf(")", 4);
str = str.substring(open + 1, pos);
System.out.println(str);
Выход
KEY1