Как разобрать строку, которая начинается и заканчивается определенным символом - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь проанализировать следующую строку с Java:

s_ev14 = cid = extCid-1: med = extMid-2: source = 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);

Ответы [ 3 ]

2 голосов
/ 05 марта 2019

Редактировать: 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 & 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"}
0 голосов
/ 05 марта 2019

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

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');
0 голосов
/ 05 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...