Извлечение из форматированной строки с использованием Java

1

У меня есть строки следующих форматов:

  • [(xx) (KEY1) некоторый текст]
  • Некоторый текст [(yy) (KEY1) некоторый текст]
  • Некоторый текст [(qq) (KEY1) некоторый текст] Больше текста здесь [(zz) (KEY2) некоторый текст] и т.д.

В основном форма [(xx) (KEYX) некоторый текст] появляется один или несколько раз в строке, смешанной с другими символами.

В вышеуказанном формате ключ - это KEYX, а значение - некоторый текст.

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

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

  • 0
    KEYX всегда 4 символа? Это всегда начинается с третьего символа?
  • 0
    KEYX - это переменная строка. Может принимать любое строковое значение. Но он всегда заключен в (). Это всегда третий персонаж. Значения префикса (xx) или (yy) в точности такие.
Теги:
string
parsing

2 ответа

1
Лучший ответ

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

     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
  • 0
    Спасибо, brso5. Хотя одна вещь. Ключ не начинается со строки «КЛЮЧ». Это может быть что угодно. Например, все действительные ключи следующие: time.zone1; url.someval; Some.key.val и т. д.
  • 0
    @naspras Эй, парень, я только что обновил его, чтобы вы соответствовали любому ключу, а не только тому, который начинается с KEY ... посмотрите раздел обновления
Показать ещё 8 комментариев
0

Если я понимаю ваш вопрос, вы можете положиться на 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню