【问题标题】:Delete text within quotes删除引号内的文本
【发布时间】:2014-05-25 16:19:43
【问题描述】:

我想删除双引号或单引号或反引号内的字符串以及封闭字符。

输入是:

Lorem ipsum "'dolor sit amet consectetur'" adipiscing "elite"  ellentesque 

scelerisque 'tortor' tortor in `vestibulum` dolor

预期输出:

Lorem ipsum adipiscing ellentesque scelerisque tortor in dolor

我有这段代码,但结果没有变化。谁能告诉我我的代码有什么问题?

line.replaceAll("[\'\"\\`].*[\'\"\\`]$", "");

【问题讨论】:

  • 能不能有同类型的转义引号,比如"he said \"foo\""
  • replace 不会更改字符串,而是创建一个新字符串。您必须将其分配给某个变量。
  • @tobias_k 里面的所有内容也将被删除。我将它附加到字符串生成器 sb.append(line.replaceAll("^[\'\"\`].*[\'\"\`]$", ""));

标签: java regex string replace


【解决方案1】:

您的正则表达式存在三个问题。

  1. 它匹配从 any 之一 "'`any 之一 "'` 的文本,不一定与开始匹配的相同。
  2. * 是贪婪的,这意味着它将匹配从第一个 "'`最后一个行中的文本。
  3. 因为您的正则表达式以$ 结尾,所以它只会匹配以整个字符串结尾的文本。

你可以这样试试:

sb.append(line.replaceAll("(?:([\"'`])[^\\1]*?\\1)\\s+|\r?\n", ""));

输入:

Lorem ipsum "'dolor sit amet consectetur'" adipiscing "elite"  ellentesque 

scelerisque 'tortor' tortor in `vestibulum` dolor

输出:

Lorem ipsum adipiscing ellentesque scelerisque tortor in dolor

这里有该正则表达式的解释和演示:http://regex101.com/r/iK3fQ8

【讨论】:

    【解决方案2】:

    将您的贪婪匹配器 .* 更改为 .+?(非贪婪)。

    并分配替换的值。

    完整代码:

    line = line.replaceAll("([\'\"\\`]).+?\1", "");
    

    感谢 tobias_k 指出我可以使用反向引用。

    还要检查java的转义规则并相应地转义。

    【讨论】:

    • "Lorem 'Ipsum'" Dolor 怎么样?你也保留了无用的$
    • @Robin,好吧,它会删除Lorem Ipsum。 OP 想删除引号之间的字符串。我还编辑并删除了$。谢谢:)
    • 您可以使用组来查找匹配的引号,例如 "([\'\"\`]).+?\1"(但不确定是否支持)
    • @AmitJoki:不:regex101.com/r/eF2gJ8。第一个匹配是"lorem'
    【解决方案3】:

    可能是这样的:

    \".*?\"|\'.*?\'|`.*`
    

    在这里演示:http://regex101.com/r/lB4xS2

    【讨论】:

      【解决方案4】:

      为了更好地阅读您的代码,我会将其拆分为几个正则表达式:

      line = line.replaceAll("\".*?\"", "");
      line = line.replaceAll("'.*?'", "");
      line = line.replaceAll("`.*?`", "");
      

      (未经测试,可能需要另一个转义)

      【讨论】:

        【解决方案5】:
        l=line;
        l=l.replaceAll("\"[^\"]+\"","");
        l=l.replaceAll("'[^\"]+'","");
        l=l.replaceAll("`[^\"]+`","");
        

        解释:

        1. " - 以" 开始一个字符串
        2. [^"]+ - 找到至少一张不是" 的图表
        3. " - 找到一个结束 "

        ' 和 ` 一样

        【讨论】:

        • 您能否解释一下这段代码(在您的回答中)?这样你可能会得到更多的支持!
        • +1,但不应该用空字符串替换吗?
        • 他说删除引号内的文本而不是引号本身。显然,如果也不需要引号,请用空替换。
        • 我知道,但是看看输入和预期输出。
        猜你喜欢
        • 2023-03-26
        • 2023-01-11
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        • 2019-08-11
        • 1970-01-01
        • 2018-03-11
        相关资源
        最近更新 更多