代码之家  ›  专栏  ›  技术社区  ›  Jeremy

regex replace更改句子中单词的顺序

  •  3
  • Jeremy  · 技术社区  · 14 年前

    如果我有这样一根绳子:

    “word1‘word2’word3”

    是否可以使用regex replace将字符串更改为:

    “word1 word3”“word2”“”

    我知道word1和word3是什么,但不知道word2是什么,但它总是在单引号中。

    4 回复  |  直到 14 年前
        1
  •  7
  •   R. Martinho Fernandes    14 年前

    你可以替换 "word1 ('\w+') word3" 具有 "word1 word3 \1" . 在其他regex引擎中,replace语法可能不同;我使用的是基于perl的.NET。

    • \w+ 匹配一系列单词字符,即单词。如果它不符合你对单词的定义,你可以改变它;
    • 括号用于分隔表达式中的组。第一组是第一组,第二组是第二组,等等。通常regex引擎将第零组作为整个匹配计算;
    • 这个 \1 在替换字符串中,表示使用匹配的第一组, \2 指第二组等。
        2
  •  4
  •   Toto    14 年前

    我会说:

    s/"(word1)\s+('.+?')\s+(word3)"/"$1 $3 $2"/
    
        3
  •  3
  •   FrustratedWithFormsDesigner    14 年前

    搜索: \"word1 (\'[a-zA-Z0-9]+\') word3\" 替换为 "word1 word3 \1"

    你也可以用 (.+) 对于word2(在捕获组1中),如果您想匹配的不仅仅是字母数字字符。我想 \w 也可以使用,但出于某种原因,我不经常使用。也许我不总是同意regex引擎关于什么应该是“单词”字符,所以我更喜欢更明确。

        4
  •  0
  •   FrustratedWithFormsDesigner    14 年前

    遵循其他建议…

    此表达式将确保word3是字符串中的最后一个单词(向前查找“然后是字符串结尾),但允许“words”除单引号和双引号之外的任何字符。

    ('[^']+?')\s+([^"]+?(?>"))$