【问题标题】:Regex to remove nested double-quotes?正则表达式删除嵌套的双引号?
【发布时间】:2013-12-21 15:45:49
【问题描述】:

如何解析带有可变数量的封闭双引号的字符串中的文本?

比如我可能会遇到这个字符串:

"""The Cellar """"Serene"""" 16-Piece Glassware Set"""

或者这个字符串,等等……:

""The Cellar """Serene""" 16-Piece Glassware Set""

我想显示这个字符串:

The Cellar "Serene" 16-Piece Glassware Set

似乎正则表达式在这里是一个理想的解决方案,因为有一个模式。在所有情况下,前 n 个双引号定义了模式。我想输出字符串的余额。

【问题讨论】:

  • 你使用什么语言?
  • 为什么第二个例子Serene后面有四个引号?错字?
  • 我看不懂你的模式!..你能解释一下吗
  • 非常感谢。至于语言,理想情况下我可以使用支持正则表达式的 Apache Hive(Hadoop 生态系统的一部分)。至于模式......在上面的例子中,前 n 个双引号定义了模式。在示例 1 中,有 3 个,所以我们在任何地方看到三个引号,它们都应该被删除。在示例 2 中,有两个,所以我们在任何地方看到两个(由外而内),都应该删除它们。我也刚刚编辑了示例 2,因为我没有删除最后一个引号(对不起)。
  • 我还可以通过 Python 流式传输字符串,在这里我有更多的灵活性。

标签: regex


【解决方案1】:

如果您可以提供有关您使用的语言的更多详细信息,它将有助于任何正则表达式风味的细节。我提供了一个小的递归函数来解决你在 javascript 中的问题。

var string = '"""The Cellar """"Serene"""" 16-Piece Glassware Set"""';
var result;
function removeExcessQuotes(str)
{
    var match = str.replace('""', '"');
    result = match;
    if(match.indexOf('""') != -1)
    {
        result = match;
        removeExcessQuotes(match);
    }

    return result;
}

console.log(removeExcessQuotes(string));

【讨论】:

  • 约翰,非常感谢。我希望将 Apache Hive 用于该语言并删除外部引号。
  • 但我也可以通过 Python 流式传输。这是一个额外的步骤,但如果我这样做了,我绝对可以调整你的例子。谢谢。
【解决方案2】:

代码会根据您使用的编程语言(PHP、Perl、JavaScript 等)而有所不同,但逻辑和正则表达式将是相同的。搜索"{2,}。这设置了您的模式,因此获取匹配字符串的长度。然后通过搜索"{n} 并替换为空字符串进行替换,其中n 是第一个匹配项的长度。

【讨论】:

  • Ed,这是正确的。理想情况下,我可以使用 Apache Hive,它是 Hadoop 与 Hadoop 的类似 SQL 的接口(它支持正则表达式)。我可以测试字符串的前 10 个字符来计算出现次数以设置 n。我对这个例子的唯一问题是是否有一种由外而内工作的方法。所以上面当我将 n 设置为 3 例如 1 时,我也得到了 4 的实例。有没有办法将它限制为 3,例如,只让 3 在外面工作?所以这将在示例 1 中留下“Serene”。
  • 我对 Hadoop 不是很熟悉,但据我了解,您最初只想获取第一个匹配项的长度(示例 1 中为 3)。如果您进行全局替换——将""" 的所有字符串替换为空字符串——然后""" 将被替换为空,"""" 变为",我相信这就是您的目标。如果我错了,请纠正我。
【解决方案3】:

试试这个代码-

str="\"\"\"The Cellar \"\"\"\"Serene\"\"\"\" 16-Piece Glassware Set\"\"\"";
replace_regexp=new RegExp(str.match(/"*/)[0], "g");
str=str.replace(replace_regexp, '');
console.log(str);

O/P

The Cellar "Serene" 16-Piece Glassware Set

注意这段代码基本上是在字符串str 的开头检索" 的编号,然后在整个字符串中递归地删除" 的相等编号。

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 2014-10-09
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多