#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. Спасибо за отзыв. По сути, я пытаюсь идентифицировать каждый тег и присвоить его определенной переменной, чтобы я мог использовать его в строке запроса.