【问题标题】:Check if a word is enclosed within quotes using javascript使用javascript检查单词是否包含在引号中
【发布时间】:2020-05-29 05:43:44
【问题描述】:

我有一个类似get(3,"No MATCH",obj) 的字符串。我想检查单词 MATCH 是否包含在引号内(单引号或双引号)。这里 MATCH 用引号括起来,虽然不完全是 "MATCH",但它仍然是包含在引号中的文本的一部分,如 "No MATCH"。
我想编写一个函数,它以单词 (MATCH) 作为参数,如果它包含在引号内则返回 true,否则返回 false。
以下是一些其他需要检查的输入字符串 功能:
* get(1101,"MATCH",obj) --> 返回真,因为 MATCH 在引号内
* get(255,'NO MATCH',obj) --> 返回 true,因为 MATCH 是包含在引号中的文本的一部分
* get(1111,"" , MATCH) ---> 返回 false,因为 MATCH 不包含在引号中

【问题讨论】:

  • 澄清是get(3,"No MATCH",obj) text 还是函数调用?
  • 有什么理由不使用引号本身搜索 get(1101,"\"MATCH\"",obj)
  • @VLAZ,它只是一个字符串,一个文本。不是函数调用。
  • @kiranvj 如果我使用引号进行搜索,则为 true,因为 "get(1101,"MATCH",obj)" 本身包含在引号中,因为它被视为字符串。

标签: javascript regex string double-quotes single-quotes


【解决方案1】:

我猜这是为了重构,所以应该这样做

  • 没有不匹配的引号(可能除了 '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

【讨论】:

    【解决方案2】:

    试试这个

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

    /['"]([ \w]+)?MATCH([ \w]+)?["']/gm
    

    【讨论】:

      【解决方案3】:

      如果您尝试执行句法分析,您应该考虑使用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"
      }
      

      您可以搜索值包括“匹配”的“文字”类型。

      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>

      【讨论】:

        猜你喜欢
        • 2012-03-26
        • 1970-01-01
        • 2021-10-11
        • 2019-05-29
        • 2011-11-08
        • 2017-11-10
        • 2014-01-25
        • 1970-01-01
        • 2018-04-21
        相关资源
        最近更新 更多