Я пытаюсь извлечь «Something is« 670px? Am »« из моей входной строки: «100000000670? «Результат был 670670px»? Что-то такое "670px? Am"? `Но я не могу понять ...

1
Capstone 8 Июл 2021 в 20:11

3 ответа

Лучший ответ

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

const input = `100000000670
? "Result was 670670px"
? "670px ?
am"
? `;

const regex = /\n\?((?:[^\n]|\n(?!\?))*\n)\? $/;

const match = input.match(regex);

console.log(match[1]);

Если вы хотите исключить начальный пробел и завершающий символ новой строки, просто используйте trim() или просто настройте регулярное выражение. Я просто следую букве приведенной выше цитаты и интерпретирую «последнюю строку» как все символы между вопросительными знаками.

Дальнейшее объяснение по запросу.

1
MikeM 8 Июл 2021 в 18:36

Одна из стратегий может заключаться в разделении строки на основе разделителей, создавая массив. Затем удалите последний элемент из массива. (Или, может быть, предпоследний.)

Преимущество такой логики, если она применима здесь, состоит в том, что то, что происходит, достаточно очевидно . "Regex spaghetti-code" - это вещь, которую следует избегать, когда это возможно.

0
Mike Robinson 8 Июл 2021 в 17:54

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

\n\?[^\S\n]*(.*(?:\n(?!\?).*)*)\n[^\S\n]*\?[^\S\n]*$
  • \n\? Соответствует новой строке и ?
  • [^\S\n]* Сопоставлять необязательные пробельные символы без новой строки
  • ( Группа захвата 1
    • .* Соответствует остальной части строки
    • (?:\n(?!\?).*)* Соответствует всем строкам, которые не начинаются с ?
  • ) Закрыть группу
  • \n[^\S\n]*\?[^\S\n]* Соответствует символу новой строки и ? между необязательными пробелами
  • $ Конец строки

Regex demo

const regex = /\n\?[^\S\n]*(.*(?:\n(?!\?).*)*)\n[^\S\n]*\?[^\S\n]*$/;
const s = `100000000670
? "Result was 670670px"
? Something is "670px ?
am"
? `;

const m = s.match(regex);
if (m) {
  console.log(m[1]);
}
1
The fourth bird 8 Июл 2021 в 19:34