【问题标题】:Regex how to replace <'string'> with a new line but keep the 'string'正则表达式如何用新行替换 <'string'> 但保留'string'
【发布时间】:2021-11-16 19:24:04
【问题描述】:

我对如何使用正则表达式一无所知,需要一些关于上述问题的帮助。我需要用新行替换&lt;&gt;,但将字符串保持在&lt;&gt; 之间。所以

<'sample text'><'sample text 2'>

变成

'sample text'
'sample text2'

【问题讨论】:

  • 您使用的是什么语言?另外,第一个 &lt; 和最后一个 &gt; 是否需要换行?
  • 只需用换行符替换&gt;&lt;,不需要正则表达式。
  • 在对其他部分进行正则表达式替换时如何保留部分字符串的一般答案是对要保留的部分使用捕获组,并在替换中使用反向引用。
  • 这个输入&lt;'sample text'&gt; &lt;'sample text 2'&gt; some text &lt;'sample text 3'&gt; &lt;&gt;的结果应该如何?
  • 对于 niitaku 它使用 powershell 和第一组和最后一组 不应该有新行。对于 barmar,我将尝试查看它是否适用于我正在使用的文本文件。 RomanPerekhrest 它应该看起来像 'sample text' new line'sample text 2' some text new line'sample text 3' new line"empty行”

标签: regex powershell replace


【解决方案1】:
\<([^>]*)\>

此正则表达式会将&lt;&gt; 之间的文本捕获到捕获组中,然后您可以再次引用它并在它们之间添加换行符。

\1\n

查看here

编辑:

在 PowerShell 中

PS C:\Users\shtabriz> $string = "<'sample text'><'sample text 2'>"
PS C:\Users\shtabriz> $regex = "\<([^>]*)\>"
PS C:\Users\shtabriz> [regex]::Replace($string, $regex, '$1'+"`n")
'sample text'
'sample text 2'

【讨论】:

    【解决方案2】:

    这在 Textpad 中适用于我:

    例子:

    字符串:

    " 1) 导航到记录。2) 导航到选项卡并选择。3) 单击字段。4) 单击选项卡并滚动。"

    注意:对于搜索/替换打击,不要包含引号,我用它们来显示搜索词中存在空格

    搜索:“[0-9]+)” 替换:“\n$0”

    结果字符串:

    1. 导航到录制。
    2. 导航到选项卡并选择。
    3. 点击该字段。
    4. 单击选项卡并滚动。

    (注意...stackoverflow 将我的“)”更改为“。”)

    【讨论】:

      【解决方案3】:

      用更 PowerShell 惯用的解决方案 和一些背景信息来补充 Shawn Tabrizi's helpful answer

      PowerShell 通过自己的 -replace operator 展示 .NET System.Text.RegularExpressions.Regex.Replace() 方法([regex]::Replace(),来自 PowerShell)的功能。

      最简洁的解决方案(但请参阅下面的潜在陷阱):

      # Note the escaped "$" ("`$")
      "<'sample text'><'sample text 2'>" -replace '<(.*?)>', "`$1`n"
      

      输出:

      'sample text'
      'sample text 2'
      
      • $1numbered capture-group substitution,指的是正则表达式 ((...)) 中的第一个(也是唯一一个)捕获组捕获的内容,即 &lt;&gt; 之间的字符串(.*?non-greedy 表达式匹配任何字符运行,但在找到下一个构造(在本例中为 &gt;)时停止)。

        • 但是,在 引号内的字符串 ("..."),也称为 expandable string$1 将被解释为 PowerShell 变量引用,因此 $ 字符必须转义才能保留,使用反引号 (`),PowerShell 的一般转义字符:"`$1"

        • 相反,如果您希望 .NET API 不解释替换字符串中的 $ 字符,请使用 $$$$ 在 @ 987654347@ 或 "`$`$""...") - 但请注意,在 regex 操作数内,$ 必须逐字转义为 \$

      • "`n" 是一个 PowerShell 转义序列,可在可扩展字符串中使用(仅限) - 请参阅概念性 about_Special_Characters 帮助主题。

      警告

      • 虽然在这里很方便,但在使用 可扩展 字符串作为正则表达式和替换操作数方面存在陷阱,因为 PowerShell 扩展(内插)的内容并不总是很明显以及 .NET API 最终看到的结果。

      • 因此,通常最好使用引用的字符串'...',也称为逐字字符串)-替换操作数和正则表达式本身,以及 - 如果需要 - 使用 表达式 ((...)) 来构建整个字符串,这允许您将逐字(传递)部分与插值部分分开.

      这就是肖恩在回答中所做的;转换为-replace 操作:

      # Note the expression used to build the substitution string
      # from a verbatim ('...') and an interpolated ("...") part.
      "<'sample text'><'sample text 2'>" -replace '<(.*?)>', ('${1}' + "`n")
      

      另一个选项,使用-fformat operator

      "<'sample text'><'sample text 2'>" -replace '<(.*?)>', ("{0}`n" -f '${1}')
      

      注意使用${1} 而不仅仅是$1:在{...} 中包含引用的捕获组的编号/名称消除歧义从后面的字符,这避免了另一个陷阱,如以下示例所示(顺便说一下,PowerShell 自己的变量引用可以用相同的方式消除歧义):

      # FAILS and results in 'f$142', because the .NET API sees
      # '$142' as the substitution string, and there is no 142nd capture group.
      $suffix = '42'; 'foo' -replace '(oo)', ('$1' + $suffix)
      
      # OK, with disambiguation via {...} -> 'foo42'
      $suffix = '42'; 'foo' -replace '(oo)', ('${1}' + $suffix)
      

      【讨论】:

        猜你喜欢
        • 2018-03-21
        • 1970-01-01
        • 2012-11-21
        • 1970-01-01
        • 2011-04-01
        • 2014-05-09
        • 2016-07-06
        相关资源
        最近更新 更多