Regex: получить элементы из строки после искомого слова - PullRequest
2 голосов
/ 20 марта 2019

У меня есть эта строка:

const string = `       
* @body
* {
*  "test": "test"
* }
* @test
* pm.test("", function() {
* });
* @example
* {
*    "name": "test1",
*    "status": "200 OK",
*    "body": {},
*    ""
* }
* @example
* {
*    "name": "test2",
*    "status": "400",
*    "body"
* }
* 
* 
`;

И я хотел бы получить содержимое переданного элемента, например, если я передам в качестве поискового слова @body, я получу в качестве вывода:

* @body
* {
*  "test": "test"
* }

И если я передам @example, я получу в качестве вывода:

* @example
* {
*    "name": "test1",
*    "status": "200 OK",
*    "body": {},
*    ""
* }
* @example
* {
*    "name": "test2",
*    "status": "400",
*    "body"
* }

Вот мой код, который я пытаюсь:

string.match(/\@([^[@]+)/g)

и вот вывод, который я получаю:

[ '@body\n* {\n*  "test": "test"\n* }\n* ',
  '@test\n* pm.test("Response time is less than 200ms", function() {\n*   pm.expect(pm.response.responseTime).to.be.below(500);\n* });\n* ',
  '@example\n* {\n*    "name": "test1",\n*    "status": "200 OK",\n*    "body": {},\n*    ""\n* }\n* ',
  '@example\n* {\n*    "name": "test2",\n*    "status": "400",\n*    "body"\n* }\n* \n* \n' ]

но когда я добавляю @body, например, все портится.

Ответы [ 2 ]

3 голосов
/ 20 марта 2019

Здесь есть опция, использующая регулярные выражения для всех. Мы можем попробовать сопоставление, используя шаблон:

@example[\s\S]*?(?=@|$)

Это получит все @example совпадения. Идея состоит в том, чтобы сопоставить @example с любым количеством контента, но не включая следующий @ термин или конец строки (в зависимости от того, что наступит раньше).

Обратите внимание, что я использовал [\s\S]* для имитации поведения DOT ALL, которое мы хотим, поскольку ваш ввод занимает несколько строк.

var re = /@example[\s\S]*?(?=@|$)/g;
var input = "* @body\n* {\n*  \"test\": \"test\"\n* }\n* @test\n* pm.test(\"\", function() {\n* });\n* @example\n* {\n*    \"name\": \"test1\",\n*    \"status\": \"200 OK\",\n*    \"body\": {},\n*    \"\"\n* }\n* @example\n* {\n*    \"name\": \"test2\",\n*    \"status\": \"400\",\n*    \"body\"\n* }\n* \n*";
var m;

do {
    m = re.exec(input);
    if (m) {
        console.log(m[0]);
    }
} while (m);
1 голос
/ 20 марта 2019

getStringSection возвращает первое совпадение из динамического регулярного выражения, сгенерированного аргументом part, переданным методу.

const string = `
* @body
* {
*  "test": "test"
* }
* @test
* pm.test("", function() {
* });
* @example
* {
*    "name": "test1",
*    "status": "200 OK",
*    "body": {},
*    ""
* }
* @example
* {
*    "name": "test2",
*    "status": "400",
*    "body"
* }
* 
`
const getStringSection = part => {
  const reg = new RegExp(`@${part}[\\s\\w*."(),{};:]*`, 'gm')
  const match = string.match(reg)
  return `${string.match(reg)}`.replace('* ,', '')
}
const body = getStringSection('body')
console.log(body)
const test = getStringSection('test')
console.log(test)
const example = getStringSection('example')
console.log(example)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...