Проверьте, заключено ли слово в кавычки, используя javascript - PullRequest
0 голосов
/ 29 мая 2020

У меня есть строка типа get(3,"No MATCH",obj). Я хочу проверить, заключено ли слово MATCH в кавычки (одинарные или двойные кавычки). Здесь ПОИСКПОЗ заключено в кавычки, хотя и не совсем как «ПОИСКПОЗ», это все же часть текста, содержащегося в кавычках как «Нет совпадения».
Я хочу написать функцию, которая принимает слово (MATCH) в качестве аргумента и возвращает true, если оно содержится в кавычках, или false, если нет.
Ниже приведены некоторые другие входные строки, которые необходимо проверить этой функцией:
* get(1101,"MATCH",obj) -> вернуть истину, поскольку ПОИСКПОЗ находится внутри кавычек
* get(255,'NO MATCH',obj) -> вернуть истину, поскольку ПОИСКПОЗ является частью текста, содержащегося в кавычках
* get(1111,"" , MATCH) ---> вернуть false, поскольку MATCH не содержится в кавычках

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Думаю, это для рефакторинга, поэтому

  • не должно быть несовпадающих кавычек (может быть, кроме таких плохих вещей, как 'MAT \' CH 'или' MAT '+' CH '
  • одинарные или двойные кавычки

Случаи с левой ручкой можно обрабатывать вручную

const inString = s => line => {
  const has = [...line.matchAll(/'[^']*'/g)].find(x => x[0].includes(s))
  return has || [...line.matchAll(/"[^"]*"/g)].find(x => x[0].includes(s))
}
const matcher = inString('MATCH')
console.log(matcher('get(1101,"MATCH",obj)'))
console.log(matcher("get(255,'YES MATCH',obj)"))
console.log(matcher('get(1111,"" , NO MATCH)')) // not in quotes
console.log(matcher('get(1111,"" , "NO MATCH\')')) // no mismatching quotes
console.log(matcher("get('a',NO MATCH , 'b')")) // wrapped by matching quotes does not match
1 голос
/ 29 мая 2020

Иметь go с этим

https://regex101.com/r/Bu4LUO/2

/['"]([ \w]+)?MATCH([ \w]+)?["']/gm
0 голосов
/ 29 мая 2020

Если вы пытаетесь выполнить анализ синтаксиса c, вам следует подумать об использовании esprima

Это AST, возвращаемый

esprima.parse(`get(1111,"" , MATCH)`);
{
  "type": "Program",
  "body": [
    {
      "type": "ExpressionStatement",
      "expression": {
        "type": "CallExpression",
        "callee": {
          "type": "Identifier",
          "name": "get"
        },
        "arguments": [
          {
            "type": "Literal",
            "value": 1111,
            "raw": "1111"
          },
          {
            "type": "Literal",
            "value": "",
            "raw": "\"\""
          },
          {
            "type": "Identifier",
            "name": "MATCH"
          }
        ]
      }
    }
  ],
  "sourceType": "script"
}

И вот для

esprima.parse(`get(255,'NO MATCH',obj)`)
{
  "type": "Program",
  "body": [
    {
      "type": "ExpressionStatement",
      "expression": {
        "type": "CallExpression",
        "callee": {
          "type": "Identifier",
          "name": "get"
        },
        "arguments": [
          {
            "type": "Literal",
            "value": 255,
            "raw": "255"
          },
          {
            "type": "Literal",
            "value": "NO MATCH",
            "raw": "'NO MATCH'"
          },
          {
            "type": "Identifier",
            "name": "obj"
          }
        ]
      }
    }
  ],
  "sourceType": "script"
}

Вы можете выполнить поиск по типу 'Literal', значение которого включает 'MATCH'.

const matcher = code => {
  const ast = esprima.parse(code);
  const args = ast.body[0].expression.arguments;
  return args.some(({value, type}) =>
       type === 'Literal'
    && typeof value === 'string'
    && value.includes('MATCH'));
};

console.log(matcher(`get(1101,"MATCH",obj)`));
console.log(matcher(`get(255,'NO MATCH',obj)`));
console.log(matcher(`get(1111,"" , MATCH)`));
<script src="https://unpkg.com/esprima@~4.0/dist/esprima.js"></script>
...