【问题标题】:Replace commas enclosed in curly braces (but not quite)替换用大括号括起来的逗号(但不完全)
【发布时间】:2018-08-25 17:35:11
【问题描述】:

这似乎是一个已经问过的问题的重复问题,但不是真的。我正在寻找的是一个或多个正则表达式,无需任何编程语言的帮助即可将以下文本 String.Concat( new string[] { "some", "random", "text", string1, string2, "end" }) 更改为 "some" + "random" + "text" + string1 + string2 + "end"

我正在考虑使用两个正则表达式,用加号替换逗号,然后删除 String.Concat( new string[] { ... })。第二部分很简单,但我在第一个正则表达式上苦苦挣扎。我使用了正向的后视表达式,但它只匹配第一个逗号:(?<=String\.Concat\(new string\[\] \{[^,}]*),

我不是专家,但我认为这是正则表达式引擎的限制。一旦第一个逗号匹配,正则表达式引擎将起始匹配索引移动到逗号之后,并且不再匹配它之前的后视组。


是否有一个正则表达式来进行这种替换,加号而不是逗号,而无需任何编程语言的帮助?

【问题讨论】:

  • 请指定您在标签中使用的语言
  • 正则表达式是搜索模式。您不能仅通过正则表达式进行字符串替换,除非它使用编程语言。您工作的环境是什么?
  • 无编程语言,notepad++

标签: regex


【解决方案1】:

就像你说的:首先用加号替换所有逗号:

正则表达式 1:/,/g

替换1:" +"

然后删除所有不必要的东西,捕获您需要的东西并使用对捕获组的反向引用作为替换:

正则表达式 2:/String\.Concat\(\s*new\s*string\s*\[\]\s*{\s*(.*?)\s*}\)/g

替换 2:"$1"(或者您可以指定反向引用)。

【讨论】:

  • 如果输入中有多余的空格怎么办?你应该让你的替换更灵活。
  • @Paul 感谢您的回复,但实际上我只想替换 String.Concat 大括号中的逗号,而不是整个文档中的所有逗号。要替换文档中的所有逗号,我不需要正则表达式,一个简单的查找和替换就足够了。
【解决方案2】:

我假设您使用的是文本编辑器:

,

替换:

+

demo

第二:

.*?{(.*?)}.*

替换

$1

demo

【讨论】:

  • 感谢您的回复,但实际上文档中还有很多其他逗号,不应该替换。我正在寻找一种解决方案来仅替换 String.Concat 的花括号内的逗号。
【解决方案3】:

您应该分两步完成。

第一次替换

s/^\s*String\s*\.Concat\s*\(\s*new\s+string\[\]\s*\{\s*("[^\}]*")\s*\}\)\s*$/$1/i

得到你

“一些”、“随机”、“文本”、字符串 1、字符串 2、“结束”

第二个

s/\s*("[^"]*"|\b\w+\b)\s*,\s*/$1 + /g

返回你想要的输出

“一些”+“随机”+“文本”+字符串1+字符串2+“结束”


检查这个:https://ideone.com/QuRKmt(Perl 中的示例代码)。

【讨论】:

    【解决方案4】:

    更新 Notepad++ 单通解决方案
    (请注意,您也可以在 RegexFormat8 中使用 Boost extended 替换选项来执行此操作)

    找到(?:String\.Concat\(\s*new\s*string\s*\[\]\s*{\s*([^,})]*?)\s*(?=,|}\))|\G(?!^)\s*,\s*([^,})]*?)\s*(?=,|}\)))(?:}\)|(?=(?:\s*,\s*[^,})]*)+}\)))

    替换(?1$1: + $2)

    (无条件替换其+ $1$2https://regex101.com/r/Vqe44r/1

    格式化-展开模式

     (?:
          String \. Concat\( \s* new \s* string \s* \[\] \s* { \s* 
          ( [^,})]*? )                  # (1)
          \s* 
          (?= , | }\) )
       |  
          \G 
          (?! ^ )
          \s* , \s* 
          ( [^,})]*? )                  # (2)
          \s* 
          (?= , | }\) )
    
     )
    
     (?:
          }\) 
       |  
          (?=
               (?:
                    \s* , \s* 
                    [^,})]* 
               )+
               }\)
          )
     )
    

    输出

    "some" + "random" + "text" + string1 + string2 + "end"

    【讨论】:

    • 你的输出中有一个额外的前导+
    • @Ωmega - 我说更换取决于用户。但是,如果使用 Notepad++ 之类的 (?(1) $1 : + $2) 您必须使用它删除分支重置。
    • 我会在 RegexFormat-8 中测试它,请稍等。
    • @lsn 这太棒了,它在 regex101 中有效,但在 notepad++ 中无效。 regex101 中的模式不匹配,此处发布的模式(不同)返回“无效的正则表达式”。
    • 替换是否有效?我从未在替换模式中看到过“条件”。我用谷歌搜索了它,但我找不到任何关于它的信息。我已经在 Notepad++ 和 Regex101 中尝试过,但没有成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多