Вход выглядит так:

0030 0110 0030 0210 0030 0310 0030 0410
0030 0510 0030 0610 0030 0710 0030 0810

Я хочу, чтобы вывод был таким:

00 30 01 10 00 30 02 10 00 30 03 10 00 30 04 10 00 30 05 10 00 30 06 10 00 30 07 10 00 30 08 10

Другими словами, я хочу, чтобы выходные данные были разделены на две (шестнадцатеричные) цифры и только одну строку.

Я пытался с этим:

const REGEX_FIND_2 = /(\w{2}(?! |\n|\r))|(\n)|(\r)/g;
const REGEX_REPLACE_2 = "$1 ";

Странно, что это работает в Sublime Text 3, но в JavaScript он добавляет еще один пробел между строками, например так:

00 30 01 10 00 30 02 10 00 30 03 10 00 30 04 10  00 30 05 10 00 30 06 10 00 30 07 10 00 30 08 10

Обратите внимание на дополнительный пробел между 04 10 и 00 30.

1
Hairi 9 Янв 2017 в 14:59

4 ответа

Лучший ответ

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

s = s.replace(/[\r\n]+/g, ' ').replace(/(\d{2})(\d{2})/g, "$1 $2");

Смотрите демоверсию JS:

var s = "0030 0110 0030 0210 0030 0310 0030 0410\r\n0030 0510 0030 0610 0030 0710 0030 0810";
console.log(s.replace(/[\r\n]+/g, ' ').replace(/(\d{2})(\d{2})/g, "$1 $2"));

Если вам нужно убедиться, что затронуты только 4-значные куски «целого слова», используйте границы слов: /\b(\d{2})(\d{2})\b/g.

2
Wiktor Stribiżew 9 Янв 2017 в 12:02

Я только опыт в .NET, но я сделаю все возможное, чтобы помочь вам.

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

var s = "0030 0110 0030 0210 0030 0310 0030 0410".replace(" ", "");

Это даст вам строку без пробелов:

s = "00300110003002100030031000300410"

Затем вы можете циклически проходить по строковым символам, и для каждых двух делать с ними то, что вы хотите (это делается с помощью оператора модуля (%) - любое другое обвинение в цикле будет либо давать 0, либо 1 из модуля. Каждый раз, когда вы нажмите «0», вы на втором проходе (и у вас есть строка)

var 2LengthCh;
var 1LengthCh;
for (var i = 0; i < s.length; i++) {
if (i%2) = 0 {
//this gets hit every second pass
2LengthCh = 1LengthCh + s.charAt(i);
}
else{
//This gets hit every first pass
1LengthCh = s.charAt(i);
 }
}
0
Cal.B 9 Янв 2017 в 12:13

Вы можете попробовать этот подход:

Требуется одна операция замены

const str = `0030 0110 0030 0210 0030 0310 0030 0410
0030 0510 0030 0610 0030 0710 0030 0810`;

const result = str.replace(/(\d{2})(\d{2})(\s+|$)/g,`$1 $2 `);

console.log(result);
0
Rizwan M.Tuman 9 Янв 2017 в 12:06

Вы можете сделать таким образом

text.split(' ').join('').split('\n').join('').replace(/(.{2})/g, '$1 ')
0
Marco Moretti 9 Янв 2017 в 12:08