正则表达式:搜索单词后从字符串中获取元素

时间:2019-03-20 14:32:49

标签: javascript regex

我有这个字符串:

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 个答案:

答案 0 :(得分:3)

这里是使用正则表达式全部匹配的选项。我们可以尝试使用以下模式进行匹配:

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

这将获得所有@example个匹配项。想法是匹配@example后跟任意数量的内容,直到但不包括下一个@字符串的末尾(以先到者为准)。< / p>

请注意,由于您的输入跨越多行,因此我使用[\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 :(得分:1)

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)