【问题标题】:Regex for string matching ****${****}***字符串匹配的正则表达式 ****${****}***
【发布时间】:2018-08-31 05:45:59
【问题描述】:

我正在尝试编写一个正则表达式,它匹配并排除文件中包含${ 后跟} 以及它之间或周围的任何字符的所有字符串。中间可以是任何字符/数字/下划线/破折号/等(里面不会有另一个括号)。

示例匹配:

hello ${VAR}
${HELLO_VAR} world
https://${WEB_VAR}

我想出了这个:egrep -v '^\${[a-zA-Z?]',虽然它似乎部分工作,我不太确定它是否正确。我该怎么做?

输入文件的字符串由换行符分隔,非常类似于简单的 java 属性。

【问题讨论】:

  • 如何拆分文件中的字符串?通过换行符、空格、标点符号?因为您知道文本文件本质上只是一个大字符串。
  • 正确地说您正在寻找一个正则表达式,您将使用它来从文件中排除行,或者您是说您想从文件中删除匹配的部分,留下包含匹配正则表达式的其余行?

标签: regex bash


【解决方案1】:

您可以尝试使用 sed 命令。

sed 's/\$\{[^}]*\}//g' <input_file> > <output_file>

这里的 sed 排除了 '{' 和 '}' 之间的所有字符,并将新内容写入新的输出文件中。

【讨论】:

  • 您可以不使用cat 并使用&lt;input_file&gt; 作为sed 参数;)
  • 使用.* 执行此操作将匹配...${foo}...${bar}...foo}...${bar 作为匹配组内的单个字符串 - 因此使用此操作将删除输入中第一个表达式中的所有内容文件到该行中的最后一个表达式,而不仅仅是单个/不同表达式的内容。 philipp 的答案使用 [^}]* 是有(很好的)理由。
  • 是的,我看到了他的回答。但是问题中写的是里面没有括号所以我没有关注它。
  • @Sharath,你错过了我的意思——${foo}something else ${bar} 将被这个正则表达式视为 foo}something else ${bar 是单个匹配的内容。实际上,${foo} 内没有 嵌套大括号,但是您的正则表达式不知道在 foo 之后停止在 } 处,而是继续到最后一个 }行。
  • @CharlesDuffy 感谢您的解释,我现在明白了。编辑我的答案以包括菲利普的答案。
【解决方案2】:

你可以试一试:

\$\{[^}]*\}

从字面上匹配${,然后是除} 之外的所有内容,然后是}

【讨论】:

    【解决方案3】:

    你说你试图排除文件中的所有字符串,所以听起来你需要一些比grep 的正则表达式更高级的东西。我会用 awk 脚本来做到这一点:

    awk '{while(match($0,/\$\{[^}]*\}/)){$0=substr($0,0,RSTART-1) substr($0,RSTART+RLENGTH)}} 1' input.txt
    

    或者,拆分以便于阅读和评论:

    {
      while (match($0,/\$\{[^}]*\}/)) {
        $0=substr($0,0,RSTART-1) substr($0,RSTART+RLENGTH)
      }
    }
    1
    

    这里的想法是,对于每一行,我们将检查正则表达式是否与该行中的任何内容匹配。如果是这样,我们将用匹配的正则表达式围绕的部分替换该行。 (我们可以替换sub(/RE/,""),但这需要每次匹配应用正则表达式两次而不是一次。)

    最后的1 是“打印当前行”的简写。无论循环是否处理任何匹配,它都会运行。

    【讨论】:

      【解决方案4】:

      只需在两个序列周围使用全局通配符.*,如:

      .*\$\{.*\}.*
      

      因为你想匹配整行,你必须在两边使用通配符,将正则表达式扩展到两端(如果你用^$锚定它并不重要,因为贪心算法会尽量扩展)注意${}必须被转义,因为它们被正则表达式语言保留。

      这可以在here 中看到。

      注意

      这个问题的标题没有指定两个大括号之间的子字符串不应该有},并且因为你只想匹配整行,所以除了a之外没有必要检查},唯一的要求是} 必须在该行中的${ 之后。无论如何,这在效率上没有任何缺点,因为解析这个正则表达式的 NFA 与另一个具有相同数量的状态。

      【讨论】:

        猜你喜欢
        • 2012-06-05
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多