【问题标题】:How to match a characters but not if they are strictly enclosed in quotes如何匹配字符,但如果它们严格用引号括起来则不匹配
【发布时间】:2018-01-30 19:37:38
【问题描述】:

范围

假设我们有一个字符串hello how are you dog? "d" I am "good" "g" ha good

要求

我想要一个正则表达式,它给出了 d 或 g 的出现,但当它们严格(没有其他字符)用引号括起来时却没有。

因此,在上面的字符串中,匹配的出现次数将是(包含在 {} 中) hello how are you {d}o{g}? "d" I am "{g}oo{d}" "g" ha {g}oo{d}

编辑

我正在尝试这样的事情:

//constructing a regex
re = RegExp(`(d|g)`, 'g')
newString = ""
'hello how are you dog? "d" I am "good" "g" ha good'
.split(re).map((word, index) => {       
    if (word.match(re) != null) {
       console.log("match")
       newString += "|" //replacement character
    } else {
       newString += word
    }
})

注意

我正在使用 Javascript。想不出一个模式。

谢谢

【问题讨论】:

  • 您还需要为正则表达式添加一些代码才能在这种情况下工作。你是提取还是替换?
  • 只是为了让你知道我正在替换。
  • 删除或替换为其他值?请完成问题中的测试用例。
  • 'lookahead' ?= 适用于这种情况。 :)
  • @user943702 它可能在 javascript 中不起作用。

标签: javascript regex regex-negation regex-group


【解决方案1】:

您需要一个正则表达式来匹配您不需要的子字符串(您将替换的子字符串),并匹配并捕获您需要保留的内容。我假设您想保留"g""d"。使用

/("[gd]")|[dg]/g

regex demo

以及完成最终工作的代码:

var rx = /("[gd]")|[dg]/g;
var s = 'hello how are you dog? "d" I am "good" "g" ha good';
var res = s.replace(rx, function($0,$1) {
  return $1 ? $1 : "|";
});
console.log(res); // => hello how are you |o|? "d" I am "|oo|" "g" ha |oo|

因此,("[gd]") 匹配并将 "g""d" 捕获到第 1 组中,如果匹配,则在替换期间将值粘贴回来(请参阅 $1 ? $1),否则,任何 d 或 @987654331其他上下文中的@与[dg]匹配,然后在replace回调方法中替换。

【讨论】:

    【解决方案2】:

    这是一种方法:

    使用stringreplace,使用函数方法和正则表达式

    ("[^"]*"|[^dg])|.
    

    您可以检查捕获是否匹配任何内容。如果不是,则匹配是您要替换/删除/转换(或其他任何内容;)的dg。在示例中,我将其设为大写。

    说明:

    正则表达式首先尝试匹配双引号字符串 - "[^"]*"。如果匹配它的捕获。如果不是,它会尝试匹配并捕获一个字符other,而不是dg - [^dg]

    如果上述之一匹配,则将其作为参数b发送到函数。

    如果没有匹配项,则将完整匹配项作为参数a 发送,这将是括号. 之外的最终替换。

    所以该函数要么在b 参数中获得一个有效 字符/字符串,要么在a 中获得一个无效 字符/字符串。如果b 未定义,则对a 执行任何操作,否则返回b

    var str = 'hello how are you dog? "d" I am "good" "g" ha good';
    
    document.write(str.replace(/("[^"]*"|[^dg])|./g, function(a, b) {
        if(b==undefined)
          return a.toUpperCase();
        return b;
      }));

    【讨论】:

    • 我错过了“(没有其他字符)”部分:S - 所以这比要求的要多一点(处理字符串中的任何地方的 d's 和 g'),但是当它们是单独.
    【解决方案3】:

    总结需求

    • 报价中至少包含 2 个字母
    • 包括一个 d 或一个 g

    然后正则表达式 = /"(?=g|d)[^"]{2,}"/gi

    1. 以双引号开头
    2. g 或 d 的前瞻搜索
    3. 后面应该有 2+ 个字母(包括 g 或 d)
    4. 以双引号结尾

    测试

    (`no quote = dog god d g 
     1 letter only = "d" "g"  
     2+ letters = "go" "do" "dog" "god", "GoOD"
    `).match(/"(?=g|d)[^"]{2,}?"/gi)
    // ["go", "do", "dog", "god", "GoOD"]
    // then do what you want..
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多