我正在尝试使用正则表达式来搜索/替换子模式,但我似乎陷入困境。注意:我在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.
非常感谢任何帮助。
答案 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}
希望这有帮助。