使用正则表达式搜索和替换子模式

时间:2016-06-03 03:52:21

标签: regex pcre textwrangler

我正在尝试使用正则表达式来搜索/替换子模式,但我似乎陷入困境。注意:我在OSX上使用TextWrangler来完成此操作。

情景:

以下是完整匹配的示例:

{constant key0="variable/three" anotherkey=$variable.inside.same.match key2="" thirdkey='exists'}

每场比赛总是:

  • 从以下内容开始:{constant key0=
  • 以单个花括号终止:}
  • 包含一个或多个key=value
    • 第一对的键是常量(在这种情况下,键是key0
    • 第一对的值是可变的(在这种情况下,值为"variable/three"
    • 每个附加对(如果有)由空格分隔

以下是最小(但完整)匹配的示例(只有一个key=value对):

{constant key0="first/variable/example"}

这是有效匹配的另一个示例,但在最后一个(并且只有)key=value对之后有尾随空格:

{constant key0="same/as/above/but/with/whitespace/after/quote" }

目标:

我需要做的是从每个匹配中提取每个key和每个value,然后重新排列它们。例如,我可能需要以下内容:

{constant key0="variable/4" variable_key_1="yes" variable_key_2=0}

......毕竟说完了之后看起来像这样:

$variable_key_1 = "yes"; $variable_key_2 = 0; {newword "variable/4"}

......其中

  • 已将$添加到提取的密钥
  • 在每个key=value对的=
  • 之间添加了空格
  • 已将;附加到每个提取的值
  • 单词constant已更改为newword
  • key0=已被完全删除。

以下是我尝试过的一些示例(注意第一个实际上有效,但只有当只有一个键/值对时):

Search:
(\{constant\s+key0=\s*)([^\}\s]+)(\s*\})
Replace:
{newword \2}

Search:
(\{constant\s+key0=)([^\s]+)(([\s]+[^\s]+)([\s]*=\s*)([^\}]+)+)(\s*\})
Replace:
I wasn't able to come up with a good way to replace the output of this one.

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于这场比赛的性质,它实际上是三个不同的正则表达式 - 一个用于确定匹配是什么,另外两个用于处理匹配。现在,我不知道你打算如何逃避报价,所以我会给每个普通擒纵系统一个。 不用多说了,这是反斜杠擒纵系统的设置:

Find:
\{constant\s+key0=([^\s"]\S*|"(\\.|[^\\"])*")(\s+[^\s=]+=([^\s"]\S*|"(\\.|[^\\"])*"))*\s*\}
Search 1:
(?<=\s)([^\s=]+)=([^\s"]\S*|"(\\.|[^\\"])*")(?=.*\})
Replace 1:
$1 = $2;
Search 2:
^\{constant\s+key0 = ([^\s"]\S*|"(\\.|[^\\"])*");\s*(?=\S)(.*)\}
Replace 2:
$2 {newword $1}

现在 URL / XML / HTML 擒纵系统,更容易解析:

Find:
\{constant\s+key0=([^\s"]\S*|"[^"]*")(\s+[^\s=]+=([^\s"]\S*|"[^"]*"))*\s*\}
Search 1:
(?<=\s)([^\s=]+)=([^\s"]\S*|"[^"]*")(?=.*\})
Replace 1:
$1 = $2;
Search 2:
^\{constant\s+key0 = ([^\s"]\S*|"[^"]*");\s*(?=\S)(.*)\}$
Replace 2:
$2 {newword $1}

希望这有帮助。