RegEx для соответствия конкретных слов и игнорирования новых строк - PullRequest
2 голосов
/ 08 мая 2019

Полный текст =

"
......
A= 
B= 12345 
....."

Я хочу получить пустое слово "" между A = и переводом строки. и хотите получить "12345" между B = и переводом строки.

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

(?<=A=)\s*(\S*)\s* 

или

(?<=B=)\s*(\S*)\s* 

Но это также принесло содержимое следующей строки.

Ответы [ 3 ]

3 голосов
/ 08 мая 2019

Это выражение может сделать это, и мы, безусловно, можем добавить больше границ, если необходимо:

^([A-B=]+\s)([0-9]+|)

У нас есть две группы захвата, которые мы можем просто назвать их, используя $1 и $2.

Graph

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

enter image description here

Редактировать:

Тогда это выражение может помочь нам сделать это, создав 3 группы захвата:

^([A-Z]+)([=\s]+)([A-z0-9-]+)

enter image description here

Тест на RegEx 1

const regex = /^([A-B=]+\s)([0-9]+|)/gm;
const str = `"
......
A= 
B= 12345 
....."`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Тест на RegEx 2

const regex = /^([A-Z]+)([=\s]+)([A-z0-9-]+)/gm;
const str = `ADFJE = 12313-asrn[5493]h`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
2 голосов
/ 08 мая 2019

Другой вариант вместо использования положительного взгляда сзади - использовать группу захвата:

^[A-Z]+[ ]*=[ ]*(\S*)
  • ^ Начало строки
  • [A-Z]+ Матч 1+ раз A-Z
  • [ ]*= Совпадение 0+ раз через пробел, за которым следует =
  • [ ]*= Совпадение 0+ раз пробел
  • (\S) Захват в группе, соответствующей 0+ раз непробельным символам (будет содержать ваше значение)

Regex demo

1 голос
/ 08 мая 2019

Как насчет этого шаблона:

(?<=[A-Z]=)[ ]*(\S*)

Этот шаблон устраняет проблему переноса на следующую строку, сначала пропуская только пробелы после A= (или B= и т. Д.).Это означает, что в случае строки A=, которая имеет только символ новой строки после нее, [ ]* будет соответствовать нулю раз.Во-вторых, для контента используется только (\S*), который также не будет занимать пробелы и переносится на следующую строку.

Демо

...