Как разобрать строку, которая начинается и заканчивается определенным символом

#javascript #parsing

#javascript #синтаксический анализ

Вопрос:

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

s_ev14=cid=extCid-1:med=extMid-2:источник=google: scode=RSG00000E017:campdesc=123456789

Предостережение заключается в том, что (cid, med, source, scode, campdesc) могут приходить в зашифрованном виде, а в некоторых случаях они могут не существовать. При этом я хочу получить строки, назначенные этим тегам. Это то, что у меня есть на данный момент:

 var Cid = input.substring(input.indexOf('cid=') 4,input.indexOf(':'));
  

и получить вывод «extCid-1», но у меня возникают трудности с анализом остальных переменных, поскольку «:» появляется в нескольких местах.

Вот мой полный код:

      <script type="text/javascript">_satellite.pageBottom();</script>

            <script type="text/javascript">
            window.addEventListener('message', function(event) {
                if (event.origin === "https://www.fdafadsfads.com"
                    || event.origin === "https://stage.rreasdfsd.com"
                    || event.origin === "https://stage-www.vderere.com"
                    || event.origin === "https://m.vereasre.com") { 
                    /* only accept messages from appropriate senders */
                    console.log('Supported origin: '   event.origin); // comment later
                } else {
                    console.log('Unsupported orgin: '   event.origin);  // comment later  
                    return;
                }
    //s_ev14=cid=extCid-1:med=extMid-2:source=google:scode=RSG00000E017:campdesc=123456789
                console.log("raw event.data: "   event.data);


                //Removes s_ev14 from the string
                //cid=extCid-1:med=extMid-2:source=google:scode=RSG00000E017:campdesc=123456789
                var SlicedData = event.data.slice(7);
                console.log("Sliced event data: "   SlicedData);


                const input = SlicedData; 

                const dictionary = {
                    cid: '',
                    med: '',
                    source: '',
                    scode: '',
                    campdesc: ''
                }

                const result = 
                    input.split(":")
                         .map(s => s.split("="))
                         .filter(o => !!o[1])
                         .reduce((dictionary, o) => {
                         dictionary[o[0]] = o[1]
                         return dictionary
                         }, dictionary)

                    const cid1 = result['cid']
                    const med1 = result['med']
                    const source1 = result['source']
                    const scode1 = result['scode']
                    const campdesc1 = result['campdesc']

console.log("Cid1: "   cid1);
            console.log("Med1: "   med1);
            console.log("Source1: "   source1);
            console.log("Scode1: "   scode1);
            console.log("Campdesc1: "   campdesc1);
  

Ответ №1:

Редактировать: OP помечен Java вместо JavaScript . Поскольку var синтаксис один и тот же, мы все запутались.

Подход, использующий Stream , может быть

 final String input = "s_ev14=cid=extCid-1:med=extMid-2:source=google:scode=RSG00000E017:campdesc=123456789";
final Map<String, String> attributes =
        Stream.of(input.substring(7).split(":"))
              .map(s -> s.split("=", 2))
              .filter(o -> o.length > 1)  // If you don't want empty values
              .collect(Collectors.toMap(o -> o[0], o -> o[1]));
  

Вывод

 {scode=RSG00000E017, campdesc=123456789, source=google, med=extMid-2, cid=extCid-1}
  

Если вам нужно присвоить каждое значение ряду переменных, просто

 final var cid = attributes.get("cid");
final var med = attributes.get("med");
final var source = attributes.get("source");
final var campdesc = attributes.get("campdesc");
  

Для этого используется Java 10 синтаксис , который, похоже, вы тоже используете.


Для JavaScript версии

 const input = "cid=extCid-1:med=extMid-2:source=:scode=RSG00000E017:campdesc=123456789"

// Default values
const dictionary = {
  cid: '',
  med: '',
  source: '',
  code: '',
  campdesc: ''
}

const result = 
    input.split(":")     // <-- Change the separator to amp; if needed
         .map(s => s.split("="))
         .filter(o => !!o[1])
         .reduce((dictionary, o) => {
            dictionary[o[0]] = o[1]
            return dictionary
         }, dictionary)  // <-- Default values as starting point

const cid = result['cid']
const med = result['med']
const source = result['source']
const code = result['code']
const campdesc = result['campdesc']
  

Вывод

 {cid: "extCid-1", med: "extMid-2", scode: "RSG00000E017", campdesc: "123456789"}
  

Комментарии:

1. Спасибо за отзыв. Высоко ценится. Это здорово, но то, что я хотел бы сделать, это присвоить каждой строке определенную переменную. Например, значение строки «med» должно быть присвоено переменной med, чтобы я мог использовать ее для выполнения поиска по этой строке в моей базе данных. У вас случайно нет каких-либо указаний?

2. @IvoDimov Эти переменные содержатся в классе? Если это так, не могли бы вы опубликовать этот класс?

3. @IvoDimov смотрите обновленный ответ. Это то, что вам нужно?

4. Еще раз спасибо. На самом деле я пытаюсь использовать Java-код на своей странице Salesforce VisualForce. Я пытаюсь прочитать URL-адрес и проанализировать каждую переменную, чтобы затем я мог использовать SOQL (SQL) для поиска в моей базе данных Salesforce. Кажется, это то, что мне нужно, но когда я ее запускаю, в консоли разработчика моего браузера происходит ошибка. Я опубликую свой текущий код

5. @IvoDimov Я не пользователь Salesforce, поэтому не могу быть уверен. Не могли бы вы, возможно, обновить свой вопрос более подробной информацией и вашим текущим кодом?

Ответ №2:

Вы можете использовать String.split(":") метод для разделения всех токенов в данной строке, а затем использовать методы String.startsWith и String.endsWith для фактического получения значений для отдельных токенов.

Комментарии:

1. Посмотрите на начало строки.

Ответ №3:

Вы можете использовать регулярное выражение:

 String s = "s_ev14=cid=extCid-1:med=extMid-2:source=google:scode=RSG00000E017:campdesc=123456789";

Map<String, String> map = new TreeMap<>();
for (Matcher m = Pattern.compile("(\w )=([^:=] )(?=:|$)").matcher(s); m.find(); )
    map.put(m.group(1), m.group(2));
map.entrySet().forEach(System.out::println);
  

Вывод

 campdesc=123456789
cid=extCid-1
med=extMid-2
scode=RSG00000E017
source=google
  

Обновить

После разбора на Map их легко извлечь в переменные:

 String cid = map.get('cid');
String med = map.get('med');
String source = map.get('source');
String scode = map.get('scode');
String campdesc = map.get('campdesc');
  

Комментарии:

1. Спасибо за отзыв. По сути, я пытаюсь идентифицировать каждый тег и присвоить его определенной переменной, чтобы я мог использовать его в строке запроса.